annotate DEPENDENCIES/generic/include/boost/flyweight/detail/dyn_perfect_fwd.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 c530137014c0
children
rev   line source
Chris@101 1 /* Copyright 2006-2014 Joaquin M Lopez Munoz.
Chris@16 2 * Distributed under the Boost Software License, Version 1.0.
Chris@16 3 * (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 4 * http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5 *
Chris@16 6 * See http://www.boost.org/libs/flyweight for library home page.
Chris@16 7 */
Chris@16 8
Chris@101 9 #ifndef BOOST_FLYWEIGHT_DETAIL_DYN_PERFECT_FWD_HPP
Chris@101 10 #define BOOST_FLYWEIGHT_DETAIL_DYN_PERFECT_FWD_HPP
Chris@101 11
Chris@101 12 #if defined(_MSC_VER)
Chris@101 13 #pragma once
Chris@101 14 #endif
Chris@101 15
Chris@101 16 #include <boost/config.hpp>
Chris@101 17
Chris@101 18 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Chris@101 19
Chris@101 20 #include <boost/preprocessor/arithmetic/add.hpp>
Chris@101 21 #include <boost/preprocessor/cat.hpp>
Chris@101 22 #include <boost/preprocessor/repetition/enum.hpp>
Chris@101 23 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@101 24 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
Chris@101 25 #include <boost/preprocessor/seq/seq.hpp>
Chris@101 26
Chris@101 27 #define BOOST_FLYWEIGHT_PERFECT_FWD_ARG(z,n,_) \
Chris@101 28 BOOST_PP_CAT(T,n)&& BOOST_PP_CAT(t,n)
Chris@101 29
Chris@101 30 #define BOOST_FLYWEIGHT_PERFECT_FWD_N_AUX(n,name,body) \
Chris@101 31 template<BOOST_PP_ENUM_PARAMS(n,typename T)> \
Chris@101 32 name(BOOST_PP_ENUM(n,BOOST_FLYWEIGHT_PERFECT_FWD_ARG,~)) \
Chris@101 33 body((FORWARD)(n))
Chris@101 34
Chris@101 35 #define BOOST_FLYWEIGHT_PERFECT_FWD_N(z,n,data) \
Chris@101 36 BOOST_FLYWEIGHT_PERFECT_FWD_N_AUX( \
Chris@101 37 n,BOOST_PP_SEQ_HEAD(data), \
Chris@101 38 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(data)))
Chris@101 39
Chris@101 40 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
Chris@101 41 BOOST_PP_REPEAT_FROM_TO( \
Chris@101 42 1,BOOST_PP_ADD(BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS,1), \
Chris@101 43 BOOST_FLYWEIGHT_PERFECT_FWD_N,(name)(body))
Chris@101 44
Chris@101 45 #define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
Chris@101 46 name()body((ENUM)(0)) \
Chris@101 47 BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body)
Chris@101 48
Chris@101 49 #else
Chris@101 50
Chris@101 51 /* no rvalue refs -> [const] Tn& overloads */
Chris@16 52
Chris@16 53 #include <boost/preprocessor/arithmetic/add.hpp>
Chris@16 54 #include <boost/preprocessor/cat.hpp>
Chris@16 55 #include <boost/preprocessor/repetition/enum.hpp>
Chris@16 56 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 57 #include <boost/preprocessor/repetition/repeat.hpp>
Chris@16 58 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
Chris@16 59 #include <boost/preprocessor/seq/elem.hpp>
Chris@16 60 #include <boost/preprocessor/seq/for_each_product.hpp>
Chris@101 61 #include <boost/preprocessor/seq/seq.hpp>
Chris@16 62 #include <boost/preprocessor/seq/size.hpp>
Chris@16 63
Chris@16 64 #define BOOST_FLYWEIGHT_CONST(b) BOOST_PP_CAT(BOOST_FLYWEIGHT_CONST,b)
Chris@16 65 #define BOOST_FLYWEIGHT_CONST0
Chris@16 66 #define BOOST_FLYWEIGHT_CONST1 const
Chris@16 67
Chris@16 68 /* if mask[n]==0 --> Tn& tn
Chris@16 69 * if mask[n]==1 --> const Tn& tn
Chris@16 70 */
Chris@16 71
Chris@16 72 #define BOOST_FLYWEIGHT_PERFECT_FWD_ARG(z,n,mask) \
Chris@16 73 BOOST_FLYWEIGHT_CONST(BOOST_PP_SEQ_ELEM(n,mask)) \
Chris@16 74 BOOST_PP_CAT(T,n)& BOOST_PP_CAT(t,n)
Chris@16 75
Chris@16 76 /* overload accepting size(mask) args, where the template args are
Chris@16 77 * marked const or not according to the given mask (a seq of 0 or 1)
Chris@16 78 */
Chris@16 79
Chris@101 80 #define BOOST_FLYWEIGHT_PERFECT_FWD_MASK_AUX(r,name,body,mask) \
Chris@16 81 template<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(mask),typename T)> \
Chris@101 82 name( \
Chris@16 83 BOOST_PP_ENUM( \
Chris@16 84 BOOST_PP_SEQ_SIZE(mask),BOOST_FLYWEIGHT_PERFECT_FWD_ARG,mask)) \
Chris@101 85 body((ENUM)(BOOST_PP_SEQ_SIZE(mask)))
Chris@101 86
Chris@101 87 #define BOOST_FLYWEIGHT_PERFECT_FWD_MASK(r,data) \
Chris@101 88 BOOST_FLYWEIGHT_PERFECT_FWD_MASK_AUX( \
Chris@101 89 r, \
Chris@101 90 BOOST_PP_SEQ_ELEM(0,BOOST_PP_SEQ_HEAD(data)), \
Chris@101 91 BOOST_PP_SEQ_ELEM(1,BOOST_PP_SEQ_HEAD(data)), \
Chris@101 92 BOOST_PP_SEQ_TAIL(data))
Chris@16 93
Chris@16 94 #define BOOST_FLYWEIGHT_01(z,n,_) ((0)(1))
Chris@16 95
Chris@16 96 /* Perfect forwarding overloads accepting 1 to n args */
Chris@16 97
Chris@101 98 #define BOOST_FLYWEIGHT_PERFECT_FWD_N(z,n,data) \
Chris@16 99 BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
Chris@101 100 BOOST_FLYWEIGHT_PERFECT_FWD_MASK, \
Chris@101 101 ((data)) \
Chris@16 102 BOOST_PP_REPEAT(n,BOOST_FLYWEIGHT_01,~))
Chris@16 103
Chris@101 104 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \
Chris@16 105 BOOST_PP_REPEAT_FROM_TO( \
Chris@16 106 1,BOOST_PP_ADD(BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS,1), \
Chris@101 107 BOOST_FLYWEIGHT_PERFECT_FWD_N,(name)(body))
Chris@16 108
Chris@101 109 #define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \
Chris@101 110 name()body((ENUM)(0)) \
Chris@101 111 BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body)
Chris@16 112
Chris@101 113 #endif
Chris@101 114 #endif