annotate DEPENDENCIES/generic/include/boost/wave/util/macro_definition.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
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(MACRO_DEFINITION_HPP_D68A639E_2DA5_4E9C_8ACD_CFE6B903831E_INCLUDED)
Chris@16 12 #define MACRO_DEFINITION_HPP_D68A639E_2DA5_4E9C_8ACD_CFE6B903831E_INCLUDED
Chris@16 13
Chris@16 14 #include <vector>
Chris@16 15 #include <list>
Chris@16 16
Chris@16 17 #include <boost/detail/atomic_count.hpp>
Chris@16 18 #include <boost/intrusive_ptr.hpp>
Chris@16 19
Chris@16 20 #include <boost/wave/wave_config.hpp>
Chris@16 21 #if BOOST_WAVE_SERIALIZATION != 0
Chris@16 22 #include <boost/serialization/serialization.hpp>
Chris@16 23 #include <boost/serialization/list.hpp>
Chris@16 24 #include <boost/serialization/vector.hpp>
Chris@16 25 #endif
Chris@16 26
Chris@16 27 #include <boost/wave/token_ids.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 // macro_definition
Chris@16 42 //
Chris@16 43 // This class containes all infos for a defined macro.
Chris@16 44 //
Chris@16 45 ///////////////////////////////////////////////////////////////////////////////
Chris@16 46 template <typename TokenT, typename ContainerT>
Chris@16 47 struct macro_definition {
Chris@16 48
Chris@16 49 typedef std::vector<TokenT> parameter_container_type;
Chris@16 50 typedef ContainerT definition_container_type;
Chris@16 51
Chris@16 52 typedef typename parameter_container_type::const_iterator
Chris@16 53 const_parameter_iterator_t;
Chris@16 54 typedef typename definition_container_type::const_iterator
Chris@16 55 const_definition_iterator_t;
Chris@16 56
Chris@16 57 macro_definition(TokenT const &token_, bool has_parameters,
Chris@16 58 bool is_predefined_, long uid_)
Chris@16 59 : macroname(token_), uid(uid_), is_functionlike(has_parameters),
Chris@16 60 replaced_parameters(false), is_available_for_replacement(true),
Chris@16 61 is_predefined(is_predefined_)
Chris@16 62 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 63 , has_ellipsis(false)
Chris@16 64 #endif
Chris@16 65 , use_count(0)
Chris@16 66 {
Chris@16 67 }
Chris@16 68 // generated copy constructor
Chris@16 69 // generated destructor
Chris@16 70 // generated assignment operator
Chris@16 71
Chris@16 72 // Replace all occurrences of the parameters throughout the macrodefinition
Chris@16 73 // with special parameter tokens to simplify later macro replacement.
Chris@16 74 // Additionally mark all occurrences of the macro name itself throughout
Chris@16 75 // the macro definition
Chris@16 76 void replace_parameters()
Chris@16 77 {
Chris@16 78 using namespace boost::wave;
Chris@16 79
Chris@16 80 if (!replaced_parameters) {
Chris@16 81 typename definition_container_type::iterator end = macrodefinition.end();
Chris@16 82 typename definition_container_type::iterator it = macrodefinition.begin();
Chris@16 83
Chris@16 84 for (/**/; it != end; ++it) {
Chris@16 85 token_id id = *it;
Chris@16 86
Chris@16 87 if (T_IDENTIFIER == id ||
Chris@16 88 IS_CATEGORY(id, KeywordTokenType) ||
Chris@16 89 IS_EXTCATEGORY(id, OperatorTokenType|AltExtTokenType) ||
Chris@16 90 IS_CATEGORY(id, OperatorTokenType))
Chris@16 91 {
Chris@16 92 // may be a parameter to replace
Chris@16 93 const_parameter_iterator_t cend = macroparameters.end();
Chris@16 94 const_parameter_iterator_t cit = macroparameters.begin();
Chris@16 95 for (typename parameter_container_type::size_type i = 0;
Chris@16 96 cit != cend; ++cit, ++i)
Chris@16 97 {
Chris@16 98 if ((*it).get_value() == (*cit).get_value()) {
Chris@16 99 (*it).set_token_id(token_id(T_PARAMETERBASE+i));
Chris@16 100 break;
Chris@16 101 }
Chris@16 102 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 103 else if (T_ELLIPSIS == token_id(*cit) &&
Chris@16 104 "__VA_ARGS__" == (*it).get_value())
Chris@16 105 {
Chris@16 106 // __VA_ARGS__ requires special handling
Chris@16 107 (*it).set_token_id(token_id(T_EXTPARAMETERBASE+i));
Chris@16 108 break;
Chris@16 109 }
Chris@16 110 #endif
Chris@16 111 }
Chris@16 112 }
Chris@16 113 }
Chris@16 114
Chris@16 115 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 116 // we need to know, if the last of the formal arguments is an ellipsis
Chris@16 117 if (macroparameters.size() > 0 &&
Chris@16 118 T_ELLIPSIS == token_id(macroparameters.back()))
Chris@16 119 {
Chris@16 120 has_ellipsis = true;
Chris@16 121 }
Chris@16 122 #endif
Chris@16 123 replaced_parameters = true; // do it only once
Chris@16 124 }
Chris@16 125 }
Chris@16 126
Chris@16 127 TokenT macroname; // macro name
Chris@16 128 parameter_container_type macroparameters; // formal parameters
Chris@16 129 definition_container_type macrodefinition; // macro definition token sequence
Chris@16 130 long uid; // unique id of this macro
Chris@16 131 bool is_functionlike;
Chris@16 132 bool replaced_parameters;
Chris@16 133 bool is_available_for_replacement;
Chris@16 134 bool is_predefined;
Chris@16 135 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 136 bool has_ellipsis;
Chris@16 137 #endif
Chris@16 138 boost::detail::atomic_count use_count;
Chris@16 139
Chris@16 140 #if BOOST_WAVE_SERIALIZATION != 0
Chris@16 141 // default constructor is needed for serialization only
Chris@16 142 macro_definition()
Chris@16 143 : uid(0), is_functionlike(false), replaced_parameters(false),
Chris@16 144 is_available_for_replacement(false), is_predefined(false)
Chris@16 145 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 146 , has_ellipsis(false)
Chris@16 147 #endif
Chris@16 148 , use_count(0)
Chris@16 149 {}
Chris@16 150
Chris@16 151 private:
Chris@16 152 friend class boost::serialization::access;
Chris@16 153 template<typename Archive>
Chris@16 154 void serialize(Archive &ar, const unsigned int version)
Chris@16 155 {
Chris@16 156 using namespace boost::serialization;
Chris@16 157 ar & make_nvp("name", macroname);
Chris@16 158 ar & make_nvp("parameters", macroparameters);
Chris@16 159 ar & make_nvp("definition", macrodefinition);
Chris@16 160 ar & make_nvp("uid", uid);
Chris@16 161 ar & make_nvp("is_functionlike", is_functionlike);
Chris@16 162 ar & make_nvp("has_replaced_parameters", replaced_parameters);
Chris@16 163 ar & make_nvp("is_available_for_replacement", is_available_for_replacement);
Chris@16 164 ar & make_nvp("is_predefined", is_predefined);
Chris@16 165 #if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0
Chris@16 166 ar & make_nvp("has_ellipsis", has_ellipsis);
Chris@16 167 #endif
Chris@16 168 }
Chris@16 169 #endif
Chris@16 170 };
Chris@16 171
Chris@16 172 #if BOOST_WAVE_SERIALIZATION == 0
Chris@16 173 ///////////////////////////////////////////////////////////////////////////////
Chris@16 174 template <typename TokenT, typename ContainerT>
Chris@16 175 inline void
Chris@16 176 intrusive_ptr_add_ref(macro_definition<TokenT, ContainerT>* p)
Chris@16 177 {
Chris@16 178 ++p->use_count;
Chris@16 179 }
Chris@16 180
Chris@16 181 template <typename TokenT, typename ContainerT>
Chris@16 182 inline void
Chris@16 183 intrusive_ptr_release(macro_definition<TokenT, ContainerT>* p)
Chris@16 184 {
Chris@16 185 if (--p->use_count == 0)
Chris@16 186 delete p;
Chris@16 187 }
Chris@16 188 #endif
Chris@16 189
Chris@16 190 ///////////////////////////////////////////////////////////////////////////////
Chris@16 191 } // namespace util
Chris@16 192 } // namespace wave
Chris@16 193 } // namespace boost
Chris@16 194
Chris@16 195 // the suffix header occurs after all of the code
Chris@16 196 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 197 #include BOOST_ABI_SUFFIX
Chris@16 198 #endif
Chris@16 199
Chris@16 200 #endif // !defined(MACRO_DEFINITION_HPP_D68A639E_2DA5_4E9C_8ACD_CFE6B903831E_INCLUDED)