the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 310 lines 11 kB view raw
1/////////////////////////////////////////////////////////////////////////////// 2/// \file repeat.hpp 3/// Contains macros to ease the generation of repetitious code constructs 4// 5// Copyright 2008 Eric Niebler. Distributed under the Boost 6// Software License, Version 1.0. (See accompanying file 7// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 9#ifndef BOOST_PROTO_REPEAT_HPP_EAN_11_24_2008 10#define BOOST_PROTO_REPEAT_HPP_EAN_11_24_2008 11 12#include <boost/preprocessor/cat.hpp> 13#include <boost/preprocessor/facilities/intercept.hpp> 14#include <boost/preprocessor/repetition/enum.hpp> 15#include <boost/preprocessor/repetition/enum_params.hpp> 16#include <boost/preprocessor/repetition/enum_binary_params.hpp> 17#include <boost/preprocessor/iteration/local.hpp> 18#include <boost/preprocessor/tuple/elem.hpp> 19#include <boost/proto/proto_fwd.hpp> // for BOOST_PROTO_MAX_ARITY 20 21//////////////////////////////////////////// 22/// INTERNAL ONLY 23#define BOOST_PROTO_ref_a_aux(Z, N, DATA)\ 24 boost::ref(BOOST_PP_CAT(proto_a, N)) 25 26/// \brief Generates a sequence like <tt>typename A0, typename A1, ...</tt> 27/// 28#define BOOST_PROTO_typename_A(N)\ 29 BOOST_PP_ENUM_PARAMS(N, typename proto_A) 30 31/// \brief Generates a sequence like <tt>A0 const &, A1 const &, ...</tt> 32/// 33#define BOOST_PROTO_A_const_ref(N)\ 34 BOOST_PP_ENUM_BINARY_PARAMS(N, proto_A, const & BOOST_PP_INTERCEPT) 35 36/// \brief Generates a sequence like <tt>A0 &, A1 &, ...</tt> 37/// 38#define BOOST_PROTO_A_ref(N)\ 39 BOOST_PP_ENUM_BINARY_PARAMS(N, proto_A, & BOOST_PP_INTERCEPT) 40 41/// \brief Generates a sequence like <tt>A0, A1, ...</tt> 42/// 43#define BOOST_PROTO_A(N)\ 44 BOOST_PP_ENUM_PARAMS(N, proto_A) 45 46/// \brief Generates a sequence like <tt>A0 const, A1 const, ...</tt> 47/// 48#define BOOST_PROTO_A_const(N)\ 49 BOOST_PP_ENUM_PARAMS(N, const proto_A) 50 51/// \brief Generates a sequence like <tt>A0 const &a0, A1 const &a0, ...</tt> 52/// 53#define BOOST_PROTO_A_const_ref_a(N)\ 54 BOOST_PP_ENUM_BINARY_PARAMS(N, proto_A, const &proto_a) 55 56/// \brief Generates a sequence like <tt>A0 &a0, A1 &a0, ...</tt> 57/// 58#define BOOST_PROTO_A_ref_a(N)\ 59 BOOST_PP_ENUM_BINARY_PARAMS(N, proto_A, &proto_a) 60 61/// \brief Generates a sequence like <tt>boost::ref(a0), boost::ref(a1), ...</tt> 62/// 63#define BOOST_PROTO_ref_a(N)\ 64 BOOST_PP_ENUM(N, BOOST_PROTO_ref_a_aux, ~) 65 66/// \brief Generates a sequence like <tt>a0, a1, ...</tt> 67/// 68#define BOOST_PROTO_a(N)\ 69 BOOST_PP_ENUM_PARAMS(N, proto_a) 70 71//////////////////////////////////////////// 72/// INTERNAL ONLY 73#define BOOST_PROTO_invoke(Z, N, DATA)\ 74 BOOST_PP_TUPLE_ELEM(5,0,DATA)(N, BOOST_PP_TUPLE_ELEM(5,1,DATA), BOOST_PP_TUPLE_ELEM(5,2,DATA), BOOST_PP_TUPLE_ELEM(5,3,DATA), BOOST_PP_TUPLE_ELEM(5,4,DATA)) 75 76/// \brief Repeatedly invoke the specified macro. 77/// 78/// BOOST_PROTO_REPEAT_FROM_TO_EX() is used generate the kind of repetitive code that is typical 79/// of EDSLs built with Proto. BOOST_PROTO_REPEAT_FROM_TO_EX(FROM, TO, MACRO, typename_A, A, A_a, a) is equivalent to: 80/// 81/// \code 82/// MACRO(FROM, typename_A, A, A_a, a) 83/// MACRO(FROM+1, typename_A, A, A_a, a) 84/// ... 85/// MACRO(TO-1, typename_A, A, A_a, a) 86/// \endcode 87#define BOOST_PROTO_REPEAT_FROM_TO_EX(FROM, TO, MACRO, typename_A, A, A_a, a)\ 88 BOOST_PP_REPEAT_FROM_TO(FROM, TO, BOOST_PROTO_invoke, (MACRO, typename_A, A, A_a, a)) 89 90/// \brief Repeatedly invoke the specified macro. 91/// 92/// BOOST_PROTO_REPEAT_FROM_TO() is used generate the kind of repetitive code that is typical 93/// of EDSLs built with Proto. BOOST_PROTO_REPEAT_FROM_TO(FROM, TO, MACRO) is equivalent to: 94/// 95/// \code 96/// MACRO(FROM, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 97/// MACRO(FROM+1, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 98/// ... 99/// MACRO(TO-1, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 100/// \endcode 101/// 102/// Example: 103/// 104/** \code 105 106// Generate BOOST_PROTO_MAX_ARITY-1 overloads of the 107// following construct() function template. 108#define M0(N, typename_A, A_const_ref, A_const_ref_a, ref_a) \ 109template<typename T, typename_A(N)> \ 110typename proto::result_of::make_expr< \ 111 proto::tag::function \ 112 , construct_helper<T> \ 113 , A_const_ref(N) \ 114>::type const \ 115construct(A_const_ref_a(N)) \ 116{ \ 117 return proto::make_expr< \ 118 proto::tag::function \ 119 >( \ 120 construct_helper<T>() \ 121 , ref_a(N) \ 122 ); \ 123} 124BOOST_PROTO_REPEAT_FROM_TO(1, BOOST_PROTO_MAX_ARITY, M0) 125#undef M0 126 127\endcode 128**/ 129/// The above invocation of BOOST_PROTO_REPEAT_FROM_TO() will generate 130/// the following code: 131/// 132/// \code 133/// template<typename T, typename A0> 134/// typename proto::result_of::make_expr< 135/// proto::tag::function 136/// , construct_helper<T> 137/// , A0 const & 138/// >::type const 139/// construct(A0 const & a0) 140/// { 141/// return proto::make_expr< 142/// proto::tag::function 143/// >( 144/// construct_helper<T>() 145/// , boost::ref(a0) 146/// ); 147/// } 148/// 149/// template<typename T, typename A0, typename A1> 150/// typename proto::result_of::make_expr< 151/// proto::tag::function 152/// , construct_helper<T> 153/// , A0 const & 154/// , A1 const & 155/// >::type const 156/// construct(A0 const & a0, A1 const & a1) 157/// { 158/// return proto::make_expr< 159/// proto::tag::function 160/// >( 161/// construct_helper<T>() 162/// , boost::ref(a0) 163/// , boost::ref(a1) 164/// ); 165/// } 166/// 167/// // ... and so on, up to BOOST_PROTO_MAX_ARITY-1 arguments ... 168/// \endcode 169#define BOOST_PROTO_REPEAT_FROM_TO(FROM, TO, MACRO)\ 170 BOOST_PROTO_REPEAT_FROM_TO_EX(FROM, TO, MACRO, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 171 172/// \brief Repeatedly invoke the specified macro. 173/// 174/// BOOST_PROTO_REPEAT_EX() is used generate the kind of repetitive code that is typical 175/// of EDSLs built with Proto. BOOST_PROTO_REPEAT_EX(MACRO, typename_A, A, A_a, a) is equivalent to: 176/// 177/// \code 178/// MACRO(1, typename_A, A, A_a, a) 179/// MACRO(2, typename_A, A, A_a, a) 180/// ... 181/// MACRO(BOOST_PROTO_MAX_ARITY, typename_A, A, A_a, a) 182/// \endcode 183#define BOOST_PROTO_REPEAT_EX(MACRO, typename_A, A, A_a, a)\ 184 BOOST_PROTO_REPEAT_FROM_TO_EX(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), MACRO, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 185 186/// \brief Repeatedly invoke the specified macro. 187/// 188/// BOOST_PROTO_REPEAT() is used generate the kind of repetitive code that is typical 189/// of EDSLs built with Proto. BOOST_PROTO_REPEAT(MACRO) is equivalent to: 190/// 191/// \code 192/// MACRO(1, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 193/// MACRO(2, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 194/// ... 195/// MACRO(BOOST_PROTO_MAX_ARITY, BOOST_PROTO_typename_A, BOOST_PROTO_A_const_ref, BOOST_PROTO_A_const_ref_a, BOOST_PROTO_ref_a) 196/// \endcode 197#define BOOST_PROTO_REPEAT(MACRO)\ 198 BOOST_PROTO_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), MACRO) 199 200/// \brief Repeatedly invoke the specified macro. 201/// 202/// BOOST_PROTO_LOCAL_ITERATE() is used generate the kind of repetitive code that is typical 203/// of EDSLs built with Proto. This macro causes the user-defined macro BOOST_PROTO_LOCAL_MACRO to 204/// be expanded with values in the range specified by BOOST_PROTO_LOCAL_LIMITS. 205/// 206/// Usage: 207/// 208/// \code 209/// #include BOOST_PROTO_LOCAL_ITERATE() 210/// \endcode 211/// 212/// Example: 213/// 214/** \code 215 216// Generate BOOST_PROTO_MAX_ARITY-1 overloads of the 217// following construct() function template. 218#define BOOST_PROTO_LOCAL_MACRO(N, typename_A, A_const_ref, \ 219 A_const_ref_a, ref_a) \ 220template<typename T, typename_A(N)> \ 221typename proto::result_of::make_expr< \ 222 proto::tag::function \ 223 , construct_helper<T> \ 224 , A_const_ref(N) \ 225>::type const \ 226construct(A_const_ref_a(N)) \ 227{ \ 228 return proto::make_expr< \ 229 proto::tag::function \ 230 >( \ 231 construct_helper<T>() \ 232 , ref_a(N) \ 233 ); \ 234} 235#define BOOST_PROTO_LOCAL_LIMITS (1, BOOST_PP_DEC(BOOST_PROTO_MAX_ARITY)) 236#include BOOST_PROTO_LOCAL_ITERATE() 237 238\endcode 239**/ 240/// The above inclusion of BOOST_PROTO_LOCAL_ITERATE() will generate 241/// the following code: 242/// 243/// \code 244/// template<typename T, typename A0> 245/// typename proto::result_of::make_expr< 246/// proto::tag::function 247/// , construct_helper<T> 248/// , A0 const & 249/// >::type const 250/// construct(A0 const & a0) 251/// { 252/// return proto::make_expr< 253/// proto::tag::function 254/// >( 255/// construct_helper<T>() 256/// , boost::ref(a0) 257/// ); 258/// } 259/// 260/// template<typename T, typename A0, typename A1> 261/// typename proto::result_of::make_expr< 262/// proto::tag::function 263/// , construct_helper<T> 264/// , A0 const & 265/// , A1 const & 266/// >::type const 267/// construct(A0 const & a0, A1 const & a1) 268/// { 269/// return proto::make_expr< 270/// proto::tag::function 271/// >( 272/// construct_helper<T>() 273/// , boost::ref(a0) 274/// , boost::ref(a1) 275/// ); 276/// } 277/// 278/// // ... and so on, up to BOOST_PROTO_MAX_ARITY-1 arguments ... 279/// \endcode 280/// 281/// If BOOST_PROTO_LOCAL_LIMITS is not defined by the user, it defaults 282/// to (1, BOOST_PROTO_MAX_ARITY) 283/// 284/// At each iteration, BOOST_PROTO_LOCAL_MACRO is invoked with the current 285/// iteration number and the following 4 macro parameters: 286/// 287/// \li BOOST_PROTO_LOCAL_typename_A 288/// \li BOOST_PROTO_LOCAL_A 289/// \li BOOST_PROTO_LOCAL_A_a 290/// \li BOOST_PROTO_LOCAL_a 291/// 292/// If these macros are not defined by the user, they default respectively to: 293/// 294/// \li BOOST_PROTO_typename_A 295/// \li BOOST_PROTO_A_const_ref 296/// \li BOOST_PROTO_A_const_ref_a 297/// \li BOOST_PROTO_ref_a 298/// 299/// After including BOOST_PROTO_LOCAL_ITERATE(), the following macros are 300/// automatically undefined: 301/// 302/// \li BOOST_PROTO_LOCAL_MACRO 303/// \li BOOST_PROTO_LOCAL_LIMITS 304/// \li BOOST_PROTO_LOCAL_typename_A 305/// \li BOOST_PROTO_LOCAL_A 306/// \li BOOST_PROTO_LOCAL_A_a 307/// \li BOOST_PROTO_LOCAL_a 308#define BOOST_PROTO_LOCAL_ITERATE() <boost/proto/detail/local.hpp> 309 310#endif