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