00001
00009 #include "SimObjectAttributesDefinition.h"
00010 #include "PCSIMException.h"
00011
00012 #include "boost/format.hpp"
00013
00014 SimObjectAttributesDefinition::SimObjectAttributesDefinition()
00015 : m_memsize(0), m_locked(false) {}
00016
00017 template< typename T >
00018 void SimObjectAttributesDefinition::add
00019 (string name) {
00020 if( m_locked ) {
00021 throw( PCSIM::Exception( "SimObjectAttributesDefinition::add", boost::str( boost::format("SimObjectAttributesDefinition already locked. Can not any new attributes.") ) ) );
00022 }
00023 if( m_offset_hash.find(name) != m_offset_hash.end() ) {
00024 throw( PCSIM::Exception( "SimObjectAttributesDefinition::add", boost::str( boost::format("Attribute with name %1% already exists.") % name ) ) );
00025 }
00026 m_offset_hash[name] = m_memsize;
00027 m_memsize += sizeof(T);
00028 }
00029
00030
00031 void SimObjectAttributesDefinition::addDouble(string const& name) {
00032 SimObjectAttributesDefinition::add<double>(name);
00033 }
00034
00035
00036 void SimObjectAttributesDefinition::addInt(string const& name) {
00037 SimObjectAttributesDefinition::add<int>(name);
00038 }
00039
00040
00041 void SimObjectAttributesDefinition::addString(string const& name, string const& value)
00042 {
00043 throw( PCSIM::Exception( "SimObjectAttributesDefinition::addString", "not implemented" ) );
00044 }
00045
00046
00047 size_t SimObjectAttributesDefinition::offset(string const& name) const
00048 {
00049 if( m_offset_hash.find(name) == m_offset_hash.end() ) {
00050 throw( PCSIM::Exception( "SimObjectAttributesDefinition::offset", boost::str( boost::format("Attribute with name %1% does not exists.") % name ) ) );
00051 }
00052
00053 return m_offset_hash[name];
00054 }
00055
00056 vector< string > SimObjectAttributesDefinition::names() const
00057 {
00058 vector< string > names(0);
00059 offsethash_t::const_iterator i;
00060 for( i = m_offset_hash.begin(); i != m_offset_hash.end(); i++ ) {
00061 names.push_back( i->first );
00062 }
00063 return names;
00064 }
00065
00066
00067 void SimObjectAttributesDefinition::lock() {
00068 m_locked = true;
00069 }
00070
00071 SimObjectAttributesDefinition::~SimObjectAttributesDefinition() {}
00072
00073 template void SimObjectAttributesDefinition::add<char>
00074 ( string name );
00075 template void SimObjectAttributesDefinition::add<short>
00076 ( string name );
00077 template void SimObjectAttributesDefinition::add<int>
00078 ( string name );
00079 template void SimObjectAttributesDefinition::add<float>
00080 ( string name );
00081 template void SimObjectAttributesDefinition::add<double>
00082 ( string name );
00083 template void SimObjectAttributesDefinition::add<long>
00084 ( string name );
00085 template void SimObjectAttributesDefinition::add<long long>
00086 ( string name );
00087