1 /*============================================================================= 2 Boost.Wave: A Standard compliant C++ preprocessor library 3 4 http://www.boost.org/ 5 6 Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost 7 Software License, Version 1.0. (See accompanying file 8 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 =============================================================================*/ 10 11 #if !defined(BOOST_SYMBOL_TABLE_HPP_32B0F7C6_3DD6_4113_95A5_E16516C6F45A_INCLUDED) 12 #define BOOST_SYMBOL_TABLE_HPP_32B0F7C6_3DD6_4113_95A5_E16516C6F45A_INCLUDED 13 14 #include <map> 15 16 #include <boost/wave/wave_config.hpp> 17 #include <boost/intrusive_ptr.hpp> 18 19 #if BOOST_WAVE_SERIALIZATION != 0 20 #include <boost/serialization/serialization.hpp> 21 #include <boost/serialization/map.hpp> 22 #include <boost/shared_ptr.hpp> 23 #else 24 #include <boost/intrusive_ptr.hpp> 25 #endif 26 27 #include <boost/iterator/transform_iterator.hpp> 28 29 // this must occur after all of the includes and before any code appears 30 #ifdef BOOST_HAS_ABI_HEADERS 31 #include BOOST_ABI_PREFIX 32 #endif 33 34 /////////////////////////////////////////////////////////////////////////////// 35 namespace boost { 36 namespace wave { 37 namespace util { 38 39 /////////////////////////////////////////////////////////////////////////////// 40 // 41 // The symbol_table class is used for the storage of defined macros. 42 // 43 /////////////////////////////////////////////////////////////////////////////// 44 45 template <typename StringT, typename MacroDefT> 46 struct symbol_table 47 #if BOOST_WAVE_SERIALIZATION != 0 48 : public std::map<StringT, boost::shared_ptr<MacroDefT> > 49 #else 50 : public std::map<StringT, boost::intrusive_ptr<MacroDefT> > 51 #endif 52 { 53 #if BOOST_WAVE_SERIALIZATION != 0 54 typedef std::map<StringT, boost::shared_ptr<MacroDefT> > base_type; 55 #else 56 typedef std::map<StringT, boost::intrusive_ptr<MacroDefT> > base_type; 57 #endif 58 typedef typename base_type::iterator iterator_type; 59 typedef typename base_type::const_iterator const_iterator_type; 60 symbol_tableboost::wave::util::symbol_table61 symbol_table(long uid_ = 0) 62 {} 63 64 #if BOOST_WAVE_SERIALIZATION != 0 65 private: 66 friend class boost::serialization::access; 67 template<typename Archive> serializeboost::wave::util::symbol_table68 void serialize(Archive &ar, const unsigned int version) 69 { 70 using namespace boost::serialization; 71 ar & make_nvp("symbol_table", 72 boost::serialization::base_object<base_type>(*this)); 73 } 74 #endif 75 76 private: 77 /////////////////////////////////////////////////////////////////////////// 78 // 79 // This is a special iterator allowing to iterate the names of all defined 80 // macros. 81 // 82 /////////////////////////////////////////////////////////////////////////// 83 template <typename StringT1> 84 struct get_first 85 { 86 typedef StringT1 const& result_type; 87 88 template <typename First, typename Second> operator ()boost::wave::util::symbol_table::get_first89 StringT1 const& operator() (std::pair<First, Second> const& p) const 90 { 91 return p.first; 92 } 93 }; 94 typedef get_first<StringT> unary_functor; 95 96 public: 97 typedef transform_iterator<unary_functor, iterator_type> 98 name_iterator; 99 typedef transform_iterator<unary_functor, const_iterator_type> 100 const_name_iterator; 101 102 template <typename Iterator> 103 static make_iteratorboost::wave::util::symbol_table104 transform_iterator<unary_functor, Iterator> make_iterator(Iterator it) 105 { 106 return boost::make_transform_iterator<unary_functor>(it); 107 } 108 }; 109 110 /////////////////////////////////////////////////////////////////////////////// 111 } // namespace util 112 } // namespace wave 113 } // namespace boost 114 115 // the suffix header occurs after all of the code 116 #ifdef BOOST_HAS_ABI_HEADERS 117 #include BOOST_ABI_SUFFIX 118 #endif 119 120 #endif // !defined(BOOST_SYMBOL_TABLE_HPP_32B0F7C6_3DD6_4113_95A5_E16516C6F45A_INCLUDED) 121