1 /* Copyright 2006-2014 Joaquin M Lopez Munoz. 2 * Distributed under the Boost Software License, Version 1.0. 3 * (See accompanying file LICENSE_1_0.txt or copy at 4 * http://www.boost.org/LICENSE_1_0.txt) 5 * 6 * See http://www.boost.org/libs/flyweight for library home page. 7 */ 8 9 #ifndef BOOST_FLYWEIGHT_DETAIL_PP_PERFECT_FWD_HPP 10 #define BOOST_FLYWEIGHT_DETAIL_PP_PERFECT_FWD_HPP 11 12 #if defined(_MSC_VER) 13 #pragma once 14 #endif 15 16 #include <boost/config.hpp> 17 18 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) 19 20 #define BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \ 21 name()body((FORWARD)(0)) 22 23 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=1 24 #define BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 25 template<typename T0> name(T0&& t0)body((FORWARD)(1)) 26 #endif 27 28 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=2 29 #define BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ 30 template<typename T0,typename T1> name(T0&& t0,T1&& t1)body((FORWARD)(2)) 31 #endif 32 33 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=3 34 #define BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ 35 template<typename T0,typename T1,typename T2> name(T0&& t0,T1&& t1,T2&& t2)body((FORWARD)(3)) 36 #endif 37 38 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=4 39 #define BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \ 40 template<typename T0,typename T1,typename T2,typename T3> name(T0&& t0,T1&& t1,T2&& t2,T3&& t3)body((FORWARD)(4)) 41 #endif 42 43 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=5 44 #define BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) \ 45 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0&& t0,T1&& t1,T2&& t2,T3&& t3,T4&& t4)body((FORWARD)(5)) 46 #endif 47 48 #else 49 50 /* no rvalue refs -> [const] Tn& overloads */ 51 52 #define BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \ 53 name()body((ENUM)(0)) 54 55 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=1 56 #define BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 57 template<typename T0> name(T0& t0)body((ENUM)(1))\ 58 template<typename T0> name(const T0& t0)body((ENUM)(1)) 59 #endif 60 61 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=2 62 #define BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ 63 template<typename T0,typename T1> name(T0& t0,T1& t1)body((ENUM)(2))\ 64 template<typename T0,typename T1> name(T0& t0,const T1& t1)body((ENUM)(2))\ 65 template<typename T0,typename T1> name(const T0& t0,T1& t1)body((ENUM)(2))\ 66 template<typename T0,typename T1> name(const T0& t0,const T1& t1)body((ENUM)(2)) 67 #endif 68 69 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=3 70 #define BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ 71 template<typename T0,typename T1,typename T2> name(T0& t0,T1& t1,T2& t2)body((ENUM)(3))\ 72 template<typename T0,typename T1,typename T2> name(T0& t0,T1& t1,const T2& t2)body((ENUM)(3))\ 73 template<typename T0,typename T1,typename T2> name(T0& t0,const T1& t1,T2& t2)body((ENUM)(3))\ 74 template<typename T0,typename T1,typename T2> name(T0& t0,const T1& t1,const T2& t2)body((ENUM)(3))\ 75 template<typename T0,typename T1,typename T2> name(const T0& t0,T1& t1,T2& t2)body((ENUM)(3))\ 76 template<typename T0,typename T1,typename T2> name(const T0& t0,T1& t1,const T2& t2)body((ENUM)(3))\ 77 template<typename T0,typename T1,typename T2> name(const T0& t0,const T1& t1,T2& t2)body((ENUM)(3))\ 78 template<typename T0,typename T1,typename T2> name(const T0& t0,const T1& t1,const T2& t2)body((ENUM)(3)) 79 #endif 80 81 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=4 82 #define BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \ 83 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ 84 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ 85 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ 86 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ 87 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ 88 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ 89 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ 90 template<typename T0,typename T1,typename T2,typename T3> name(T0& t0,const T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ 91 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ 92 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ 93 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ 94 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,T1& t1,const T2& t2,const T3& t3)body((ENUM)(4))\ 95 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,T2& t2,T3& t3)body((ENUM)(4))\ 96 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,T2& t2,const T3& t3)body((ENUM)(4))\ 97 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,const T2& t2,T3& t3)body((ENUM)(4))\ 98 template<typename T0,typename T1,typename T2,typename T3> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3)body((ENUM)(4)) 99 #endif 100 101 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS>=5 102 #define BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) \ 103 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 104 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 105 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 106 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 107 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 108 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 109 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 110 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 111 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 112 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 113 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 114 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 115 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 116 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 117 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 118 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(T0& t0,const T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 119 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 120 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 121 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 122 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 123 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 124 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 125 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 126 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 127 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 128 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 129 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 130 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,T2& t2,const T3& t3,const T4& t4)body((ENUM)(5))\ 131 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,T3& t3,T4& t4)body((ENUM)(5))\ 132 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,T3& t3,const T4& t4)body((ENUM)(5))\ 133 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3,T4& t4)body((ENUM)(5))\ 134 template<typename T0,typename T1,typename T2,typename T3,typename T4> name(const T0& t0,const T1& t1,const T2& t2,const T3& t3,const T4& t4)body((ENUM)(5)) 135 #endif 136 137 #endif 138 139 #if BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==0 140 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) 141 #elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==1 142 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \ 143 BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) 144 #elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==2 145 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \ 146 BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 147 BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) 148 #elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==3 149 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \ 150 BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 151 BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ 152 BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) 153 #elif BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==4 154 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \ 155 BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 156 BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ 157 BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ 158 BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) 159 #else /* BOOST_FLYWEIGHT_LIMIT_PERFECT_FWD_ARGS==5 */ 160 #define BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) \ 161 BOOST_FLYWEIGHT_PERFECT_FWD_1(name,body) \ 162 BOOST_FLYWEIGHT_PERFECT_FWD_2(name,body) \ 163 BOOST_FLYWEIGHT_PERFECT_FWD_3(name,body) \ 164 BOOST_FLYWEIGHT_PERFECT_FWD_4(name,body) \ 165 BOOST_FLYWEIGHT_PERFECT_FWD_5(name,body) 166 #endif 167 168 #define BOOST_FLYWEIGHT_PERFECT_FWD(name,body) \ 169 BOOST_FLYWEIGHT_PERFECT_FWD_0(name,body) \ 170 BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(name,body) 171 172 #endif 173