00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00033
00034
00035 #ifndef _XST_DICTIONARY_TRANSLATOR_H_INCLUDED_
00036 #define _XST_DICTIONARY_TRANSLATOR_H_INCLUDED_
00037
00038 namespace cttl_impl {
00039
00062 template< typename SequenceT, typename MapT >
00063 class xst_dictionary_translator
00064 {
00065 public:
00067 typedef typename SequenceT::value_type value_T;
00068
00069 private:
00071 SequenceT& m_sequence;
00072
00074 MapT& m_map;
00075
00076 public:
00078 xst_dictionary_translator( SequenceT& vector_, MapT& map_ )
00079 :
00080 m_sequence( vector_ ),
00081 m_map( map_ )
00082 {
00083 }
00084
00086 xst_dictionary_translator( xst_dictionary_translator< SequenceT, MapT > const& other_ )
00087 :
00088 m_sequence( other_.m_sequence ),
00089 m_map( other_.m_map )
00090 {
00091 }
00092
00094 void operator=( xst_dictionary_translator< SequenceT, MapT > const& ) const
00095 {
00096 }
00097
00107 template< typename InputValueT >
00108 int operator() ( InputValueT const& value_ )
00109 {
00110 int id = m_sequence.size();
00111
00112 typename MapT::const_iterator it = m_map.find( value_T( value_ ) );
00113 if ( it == m_map.end() ) {
00114
00115
00116 m_map.insert(
00117 std::make_pair( value_, id )
00118 );
00119 m_sequence.push_back( value_T( value_ ) );
00120
00121
00122 } else
00123
00124 id = it->second;
00125
00126 trace_deposit( id );
00127 return id;
00128 }
00129
00130 private:
00132 void trace_deposit( int id_ )
00133 {
00134 CTTL_TRACE_DEPOSIT_TEXT( "dictionary[" );
00135 CTTL_TRACE_DEPOSIT_TEXT( id_ );
00136 CTTL_TRACE_DEPOSIT_TEXT( "]=\"" );
00137 CTTL_TRACE_DEPOSIT_TEXT( m_sequence[ id_ ] );
00138 CTTL_TRACE_DEPOSIT_TEXT( "\" " );
00139 }
00140
00141 };
00142
00143
00144 }
00145
00146
00147 #endif //_XST_DICTIONARY_TRANSLATOR_H_INCLUDED_