/** \file
 *
 *  Contains the DataAccessor class definition.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#ifndef DATAACCESSOR_H_
#define DATAACCESSOR_H_

#include "data/BinaryDataType.h"
#include "data/ElementURI.h"
#include "logger/Logger.h"

class Component;
class DataElement;
class DataAccess;
class Unit;
class UniversalDataElement;

/**
 *  Abstact base class of all elements which can write to,
 *  or read from the slate.
 *
 *  \ingroup data
 */
class DataAccessor
{
    friend class Slate;

public:

    enum AccessorType
    {
        DATA_READER = 0,
        DATA_WRITER = 1
    };

    enum RequestStrategy
    {
        NO_STRATEGY = -1,
        MIN_POWER,
        MIN_ERROR,
        MIN_LATENCY,
        MAX_FREQUENCY,
        ALL_DEVICES,
        STRATEGY_COUNT
    };

    static const char* const REQUEST_STRATEGY_STRS[STRATEGY_COUNT];

    static RequestStrategy Str2RequestStrategy( const char* const strategyStr );

    static const char* RequestStrategy2Str( DataAccessor::RequestStrategy strategy );

    virtual ~DataAccessor()
    {}

    virtual DataElement& getElement( void ) const
    {
        return element_;
    }

    virtual Component* getOwner( void ) const
    {
        return owner_;
    }

    virtual const ElementURI& getUri( void ) const;

    AccessorType getAccessorType() const
    {
        return accessorType_;
    }

    DataAccess* getDataAccess() const
    {
        return dataAccess_;
    }

    Logger::TimePrecisionType getTimePrecision() const
    {
        return timePrecision_;
    }

protected:

    DataAccessor( Component* owner, DataElement& element,
                  AccessorType accessorType, UniversalDataElement* universal,
                  Logger::TimePrecisionType timePrecision = Logger::TIME_PRECISION_MILLIS );

    Component* owner_;
    DataElement& element_;
    AccessorType accessorType_;
    Logger::TimePrecisionType timePrecision_;
    DataAccess* dataAccess_;

private:
    // Note that the copy constructor below is private and not given a body.
    // Any attempt to call it will return a compiler error.
    DataAccessor( const DataAccessor& old ); // disallow copy constructor

};

#endif /*DATAACCESSOR_H_*/
