TuttleOFX  1
INode.cpp
Go to the documentation of this file.
00001 #include "INode.hpp"
00002 
00003 #include "ImageEffectNode.hpp"
00004 
00005 #include <tuttle/host/graph/ProcessVertexData.hpp>
00006 #include <tuttle/host/graph/ProcessVertexAtTimeData.hpp>
00007 
00008 #include <boost/foreach.hpp>
00009 #include <boost/algorithm/string/join.hpp>
00010 #include <boost/lexical_cast.hpp>
00011 
00012 namespace tuttle {
00013 namespace host {
00014 
00015 INode::~INode() {}
00016 
00017 ImageEffectNode& INode::asImageEffectNode( )
00018 {
00019         return dynamic_cast<ImageEffectNode&> ( *this );
00020 }
00021 
00022 const ImageEffectNode& INode::asImageEffectNode( ) const
00023 {
00024         return dynamic_cast<const ImageEffectNode&> ( *this );
00025 }
00026 
00027 std::string INode::getVersionStr() const
00028 {
00029         std::vector<int> vInt = getVersion();
00030         std::vector<std::string> vStr;
00031         BOOST_FOREACH( const int v, vInt )
00032         {
00033                 vStr.push_back( boost::lexical_cast<std::string>(v) );
00034         }
00035         return boost::algorithm::join( vStr, "." );
00036 }
00037 
00038 void INode::setProcessData( Data* data )
00039 {
00040         _data = data;
00041 }
00042 
00043 void INode::setProcessDataAtTime( DataAtTime* dataAtTime )
00044 {
00045         TUTTLE_TLOG( TUTTLE_TRACE, "setProcessDataAtTime \"" << getName() << "\" at " << dataAtTime->_time );
00046         _dataAtTime[dataAtTime->_time] = dataAtTime;
00047 }
00048 
00049 void INode::clearProcessDataAtTime()
00050 {
00051         _dataAtTime.clear();
00052 }
00053 
00054 INode::Data& INode::getData()
00055 {
00056         if( !_data )
00057         {
00058                 BOOST_THROW_EXCEPTION( exception::Bug()
00059                         << exception::dev("Process data not set.")
00060                         << exception::nodeName( getName() ) );
00061         }
00062         return *_data;
00063 }
00064 
00065 const INode::Data& INode::getData() const
00066 {
00067         if( !_data )
00068         {
00069                 BOOST_THROW_EXCEPTION( exception::Bug()
00070                         << exception::dev("Process data not set.")
00071                         << exception::nodeName( getName() ) );
00072         }
00073         return *_data;
00074 }
00075 
00076 bool INode::hasData( const OfxTime time ) const
00077 {
00078         DataAtTimeMap::const_iterator it = _dataAtTime.find( time );
00079         return it != _dataAtTime.end();
00080 }
00081 
00082 const INode::DataAtTime& INode::getData( const OfxTime time ) const
00083 {
00084         //TUTTLE_TLOG( TUTTLE_TRACE, "- INode::getData(" << time << ") of " << getName() );
00085         DataAtTimeMap::const_iterator it = _dataAtTime.find( time );
00086         if( it == _dataAtTime.end() )
00087         {
00088                 std::ostringstream ss;
00089                 ss << "Defined times : ";
00090                 BOOST_FOREACH( const DataAtTimeMap::value_type& v, _dataAtTime )
00091                 {
00092                         ss << v.first << ", ";
00093                 }
00094                 BOOST_THROW_EXCEPTION( exception::Bug()
00095                         << exception::dev() + "Process data at time not set.\n"
00096                                                                 + ss.str()
00097                         << exception::nodeName( getName() )
00098                         //<< exception::pluginIdentifier( getPlugin().getIdentifier() )
00099                         << exception::time( time ) );
00100         }
00101         return *it->second;
00102 }
00103 
00104 INode::DataAtTime& INode::getData( const OfxTime time )
00105 {
00106         return const_cast<DataAtTime&>( const_cast<const This*>(this)->getData(time) );
00107 }
00108 
00109 const INode::DataAtTime& INode::getFirstData() const
00110 {
00111         DataAtTimeMap::const_iterator it = _dataAtTime.begin();
00112         if( it == _dataAtTime.end() )
00113         {
00114                 BOOST_THROW_EXCEPTION( exception::Bug()
00115                         << exception::dev() + "Process data empty."
00116                         << exception::nodeName( getName() ) );
00117         }
00118         return *it->second;
00119 }
00120 
00121 INode::DataAtTime& INode::getFirstData()
00122 {
00123         return const_cast<DataAtTime&>( const_cast<const This*>(this)->getFirstData() );
00124 }
00125 
00126 const INode::DataAtTime& INode::getLastData() const
00127 {
00128         DataAtTimeMap::const_reverse_iterator it = _dataAtTime.rbegin();
00129         if( it == _dataAtTime.rend() )
00130         {
00131                 BOOST_THROW_EXCEPTION( exception::Bug()
00132                         << exception::dev() + "Process data empty."
00133                         << exception::nodeName( getName() ) );
00134         }
00135         return *it->second;
00136 }
00137 
00138 INode::DataAtTime& INode::getLastData()
00139 {
00140         return const_cast<DataAtTime&>( const_cast<const This*>(this)->getLastData() );
00141 }
00142 
00143 std::ostream& operator<<( std::ostream& os, const INode& v )
00144 {
00145         return v.print(os);
00146 }
00147 
00148 }
00149 }