// This file may be redistributed and modified only under the terms of
// the GNU Lesser General Public License (See COPYING for details).
// Copyright 2000-2001 Stefanus Du Toit and Aloril.
// Copyright 2001-2005 Alistair Riddoch.
// Automatically generated using gen_cpp.py.

#include <Atlas/Objects/RootOperation.h>

using Atlas::Message::Element;
using Atlas::Message::MapType;

namespace Atlas { namespace Objects { namespace Operation { 

const std::string SERIALNO_ATTR = "serialno";
const std::string REFNO_ATTR = "refno";
const std::string FROM_ATTR = "from";
const std::string TO_ATTR = "to";
const std::string SECONDS_ATTR = "seconds";
const std::string FUTURE_SECONDS_ATTR = "future_seconds";
const std::string ARGS_ATTR = "args";

int RootOperationData::getAttrClass(const std::string& name) const
{
    if (attr_flags_RootOperationData->find(name) != attr_flags_RootOperationData->end()) {
        return ROOT_OPERATION_NO;
    }
    return RootData::getAttrClass(name);
}

int RootOperationData::getAttrFlag(const std::string& name) const
{
    std::map<std::string, int>::const_iterator I = attr_flags_RootOperationData->find(name);
    if (I != attr_flags_RootOperationData->end()) {
        return I->second;
    }
    return RootData::getAttrFlag(name);
}

int RootOperationData::copyAttr(const std::string& name, Element & attr) const
{
    if (name == SERIALNO_ATTR) { attr = getSerialno(); return 0; }
    if (name == REFNO_ATTR) { attr = getRefno(); return 0; }
    if (name == FROM_ATTR) { attr = getFrom(); return 0; }
    if (name == TO_ATTR) { attr = getTo(); return 0; }
    if (name == SECONDS_ATTR) { attr = getSeconds(); return 0; }
    if (name == FUTURE_SECONDS_ATTR) { attr = getFutureSeconds(); return 0; }
    if (name == ARGS_ATTR) { attr = getArgsAsList(); return 0; }
    return RootData::copyAttr(name, attr);
}

void RootOperationData::setAttr(const std::string& name, const Element& attr)
{
    if (name == SERIALNO_ATTR) { setSerialno(attr.asInt()); return; }
    if (name == REFNO_ATTR) { setRefno(attr.asInt()); return; }
    if (name == FROM_ATTR) { setFrom(attr.asString()); return; }
    if (name == TO_ATTR) { setTo(attr.asString()); return; }
    if (name == SECONDS_ATTR) { setSeconds(attr.asFloat()); return; }
    if (name == FUTURE_SECONDS_ATTR) { setFutureSeconds(attr.asFloat()); return; }
    if (name == ARGS_ATTR) { setArgsAsList(attr.asList()); return; }
    RootData::setAttr(name, attr);
}

void RootOperationData::removeAttr(const std::string& name)
{
    if (name == SERIALNO_ATTR)
        { m_attrFlags &= ~SERIALNO_FLAG; return;}
    if (name == REFNO_ATTR)
        { m_attrFlags &= ~REFNO_FLAG; return;}
    if (name == FROM_ATTR)
        { m_attrFlags &= ~FROM_FLAG; return;}
    if (name == TO_ATTR)
        { m_attrFlags &= ~TO_FLAG; return;}
    if (name == SECONDS_ATTR)
        { m_attrFlags &= ~SECONDS_FLAG; return;}
    if (name == FUTURE_SECONDS_ATTR)
        { m_attrFlags &= ~FUTURE_SECONDS_FLAG; return;}
    if (name == ARGS_ATTR)
        { m_attrFlags &= ~ARGS_FLAG; return;}
    RootData::removeAttr(name);
}

inline void RootOperationData::sendSerialno(Atlas::Bridge & b) const
{
    if(m_attrFlags & SERIALNO_FLAG) {
        b.mapIntItem(SERIALNO_ATTR, attr_serialno);
    }
}

inline void RootOperationData::sendRefno(Atlas::Bridge & b) const
{
    if(m_attrFlags & REFNO_FLAG) {
        b.mapIntItem(REFNO_ATTR, attr_refno);
    }
}

inline void RootOperationData::sendFrom(Atlas::Bridge & b) const
{
    if(m_attrFlags & FROM_FLAG) {
        b.mapStringItem(FROM_ATTR, attr_from);
    }
}

inline void RootOperationData::sendTo(Atlas::Bridge & b) const
{
    if(m_attrFlags & TO_FLAG) {
        b.mapStringItem(TO_ATTR, attr_to);
    }
}

inline void RootOperationData::sendSeconds(Atlas::Bridge & b) const
{
    if(m_attrFlags & SECONDS_FLAG) {
        b.mapFloatItem(SECONDS_ATTR, attr_seconds);
    }
}

inline void RootOperationData::sendFutureSeconds(Atlas::Bridge & b) const
{
    if(m_attrFlags & FUTURE_SECONDS_FLAG) {
        b.mapFloatItem(FUTURE_SECONDS_ATTR, attr_future_seconds);
    }
}

inline void RootOperationData::sendArgs(Atlas::Bridge & b) const
{
    if(m_attrFlags & ARGS_FLAG) {
        b.mapListItem(ARGS_ATTR);
        const std::vector<Root> & v = attr_args;
        std::vector<Root>::const_iterator I = v.begin();
        for (; I != v.end(); ++I) {
           b.listMapItem();
           (*I)->sendContents(b);
           b.mapEnd();
        }
        b.listEnd();
    }
}

void RootOperationData::sendContents(Bridge & b) const
{
    sendSerialno(b);
    sendRefno(b);
    sendFrom(b);
    sendTo(b);
    sendSeconds(b);
    sendFutureSeconds(b);
    sendArgs(b);
    RootData::sendContents(b);
}

void RootOperationData::addToMessage(MapType & m) const
{
    RootData::addToMessage(m);
    if(m_attrFlags & SERIALNO_FLAG)
        m[SERIALNO_ATTR] = attr_serialno;
    if(m_attrFlags & REFNO_FLAG)
        m[REFNO_ATTR] = attr_refno;
    if(m_attrFlags & FROM_FLAG)
        m[FROM_ATTR] = attr_from;
    if(m_attrFlags & TO_FLAG)
        m[TO_ATTR] = attr_to;
    if(m_attrFlags & SECONDS_FLAG)
        m[SECONDS_ATTR] = attr_seconds;
    if(m_attrFlags & FUTURE_SECONDS_FLAG)
        m[FUTURE_SECONDS_ATTR] = attr_future_seconds;
    if(m_attrFlags & ARGS_FLAG)
        m[ARGS_ATTR] = getArgsAsList();
    return;
}

void RootOperationData::iterate(int& current_class, std::string& attr) const
{
    // If we've already finished this class, chain to the parent
    if(current_class >= 0 && current_class != ROOT_OPERATION_NO) {
        RootData::iterate(current_class, attr);
        return;
    }

    static const char *attr_list[] = {"serialno","refno","from","to","seconds","future_seconds","args",};
    static const unsigned n_attr = sizeof(attr_list) / sizeof(const char*);

    unsigned next_attr = n_attr; // so we chain to the parent if we don't find attr

    if(attr.empty()) // just staring on this class
        next_attr = 0;
    else {
      for(unsigned i = 0; i < n_attr; ++i) {
         if(attr == attr_list[i]) {
             next_attr = i + 1;
             break;
         }
      }
    }

    if(next_attr == n_attr) { // last one on the list
        current_class = -1;
        attr = "";
        RootData::iterate(current_class, attr); // chain to parent
    }
    else {
        current_class = ROOT_OPERATION_NO;
        attr = attr_list[next_attr];
    }
}

RootOperationData::~RootOperationData()
{
}

RootOperationData * RootOperationData::copy() const
{
    RootOperationData * copied = RootOperationData::alloc();
    *copied = *this;
    copied->m_refCount = 0;
    return copied;
}

bool RootOperationData::instanceOf(int classNo) const
{
    if(ROOT_OPERATION_NO == classNo) return true;
    return RootData::instanceOf(classNo);
}

//freelist related methods specific to this class
RootOperationData *RootOperationData::defaults_RootOperationData = 0;
RootOperationData *RootOperationData::begin_RootOperationData = 0;

RootOperationData *RootOperationData::alloc()
{
    if(begin_RootOperationData) {
        RootOperationData *res = begin_RootOperationData;
        assert( res->m_refCount == 0 );
        res->m_attrFlags = 0;
        res->m_attributes.clear();
        begin_RootOperationData = (RootOperationData *)begin_RootOperationData->m_next;
        return res;
    }
    return new RootOperationData(RootOperationData::getDefaultObjectInstance());
}

void RootOperationData::free()
{
    m_next = begin_RootOperationData;
    begin_RootOperationData = this;
}

std::map<std::string, int> * RootOperationData::attr_flags_RootOperationData = 0;

RootOperationData *RootOperationData::getDefaultObjectInstance()
{
    if (defaults_RootOperationData == 0) {
        defaults_RootOperationData = new RootOperationData;
        defaults_RootOperationData->attr_objtype = "op";
        defaults_RootOperationData->attr_serialno = 0;
        defaults_RootOperationData->attr_refno = 0;
        defaults_RootOperationData->attr_seconds = 0.0;
        defaults_RootOperationData->attr_future_seconds = 0.0;
        defaults_RootOperationData->attr_stamp = 0.0;
        defaults_RootOperationData->attr_parents = std::list<std::string>(1, "root_operation");
        attr_flags_RootOperationData = new std::map<std::string, int>;
        (*attr_flags_RootOperationData)[SERIALNO_ATTR] = SERIALNO_FLAG;
        (*attr_flags_RootOperationData)[REFNO_ATTR] = REFNO_FLAG;
        (*attr_flags_RootOperationData)[FROM_ATTR] = FROM_FLAG;
        (*attr_flags_RootOperationData)[TO_ATTR] = TO_FLAG;
        (*attr_flags_RootOperationData)[SECONDS_ATTR] = SECONDS_FLAG;
        (*attr_flags_RootOperationData)[FUTURE_SECONDS_ATTR] = FUTURE_SECONDS_FLAG;
        (*attr_flags_RootOperationData)[ARGS_ATTR] = ARGS_FLAG;
        RootData::getDefaultObjectInstance();
    }
    return defaults_RootOperationData;
}

RootOperationData *RootOperationData::getDefaultObject()
{
    return RootOperationData::getDefaultObjectInstance();
}

} } } // namespace Atlas::Objects::Operation


syntax highlighted by Code2HTML, v. 0.9.1