/* Boost.Flyweight test of flyweight forwarding and initializer_list ctors. * * Copyright 2006-2015 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See http://www.boost.org/libs/flyweight for library home page. */ #include "test_multictor.hpp" #include /* keep it first to prevent nasty warns in MSVC */ #include #include #include #include #include #include using boost::flyweight; #if BOOST_WORKAROUND(BOOST_MSVC,<1300) #define NONCONST const #else #define NONCONST #endif struct multictor { typedef multictor type; multictor(): t(0,0,0.0,"",false){} multictor(NONCONST int& x0): t(x0,0,0.0,"",false){} multictor(int x0,NONCONST char& x1): t(x0,x1,0.0,"",false){} multictor(int x0,char x1,NONCONST double& x2): t(x0,x1,x2,"",false){} multictor(int x0,char x1,double x2,NONCONST std::string& x3): t(x0,x1,x2,x3,false){} multictor(int x0,char x1,double x2,const std::string& x3,NONCONST bool& x4): t(x0,x1,x2,x3,x4){} friend bool operator==(const type& x,const type& y){return x.t==y.t;} friend bool operator< (const type& x,const type& y){return x.t< y.t;} friend bool operator!=(const type& x,const type& y){return x.t!=y.t;} friend bool operator> (const type& x,const type& y){return x.t> y.t;} friend bool operator>=(const type& x,const type& y){return x.t>=y.t;} friend bool operator<=(const type& x,const type& y){return x.t<=y.t;} boost::tuples::tuple t; }; #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) namespace boost{ #endif inline std::size_t hash_value(const multictor& x) { std::size_t res=0; boost::hash_combine(res,boost::tuples::get<0>(x.t)); boost::hash_combine(res,boost::tuples::get<1>(x.t)); boost::hash_combine(res,boost::tuples::get<2>(x.t)); boost::hash_combine(res,boost::tuples::get<3>(x.t)); boost::hash_combine(res,boost::tuples::get<4>(x.t)); return res; } #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) } /* namespace boost */ #endif #if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) #define INIT0(_) {} #define INIT1(a) {a} #define INIT2(a,b) {a,b} #define INIT_LIST1(a) {a} #define INIT_LIST2(a,b) {a,b} #else #define INIT0(_) #define INIT1(a) ((a)) #define INIT2(a,b) ((a),(b)) #define INIT_LIST1(a) ({a}) #define INIT_LIST2(a,b) ({a,b}) #endif struct initctor { struct arg{arg(int= 0){}}; initctor():res(-1){} initctor(arg,arg):res(-2){} initctor(int,unsigned int):res(-3){} initctor(std::initializer_list list):res(0) { typedef const int* iterator; for(iterator it=list.begin(),it_end=list.end();it!=it_end;++it){ res+=*it; } } initctor(std::initializer_list list):res(0) { typedef const unsigned int* iterator; for(iterator it=list.begin(),it_end=list.end();it!=it_end;++it){ res+=(int)(*it)*2; } } friend bool operator==(const initctor& x,const initctor& y) { return x.res==y.res; } int res; }; #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) namespace boost{ #endif inline std::size_t hash_value(const initctor& x) { return (std::size_t)(x.res); } #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) } /* namespace boost */ #endif #endif void test_multictor() { flyweight f; multictor m; BOOST_TEST(f==m); int x0=1; flyweight f0(x0); multictor m0(x0); BOOST_TEST(f0==m0); char x1='a'; flyweight f1(1,x1); multictor m1(1,x1); BOOST_TEST(f1==m1); double x2=3.1416; flyweight f2(1,'a',x2); multictor m2(1,'a',x2); BOOST_TEST(f2==m2); std::string x3("boost"); flyweight f3(1,'a',3.1416,x3); multictor m3(1,'a',3.1416,x3); BOOST_TEST(f3==m3); bool x4=true; flyweight f4(1,'a',3.1416,"boost",x4); multictor m4(1,'a',3.1416,"boost",x4); BOOST_TEST(f4==m4); #if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) flyweight ff INIT0(~); BOOST_TEST(ff.get().res==-1); ff=flyweight INIT2(initctor::arg(),1); BOOST_TEST(ff.get().res==-2); flyweight ff0 INIT2(initctor::arg(),initctor::arg()); BOOST_TEST(ff0.get().res==-2); ff0={1}; BOOST_TEST(ff0.get().res==1); flyweight ff1 INIT_LIST2(1,2); BOOST_TEST(ff1.get().res==3); ff1={1u,2u,3u}; BOOST_TEST(ff1.get().res==12); flyweight ff2 INIT_LIST1(1u); BOOST_TEST(ff2.get().res==2); #endif }