#pragma once #include namespace fc { /** * Provides a fast-compiling tuple that doesn't use fancy meta-programming * techniques. It is limited to 4 parameters which is sufficient for most * methods argument lists which is the primary use case for this tuple. Methods * that require more than 4 parameters are probably better served by defining * a struct. * * The members of the tuple are easily visited with a simple visitor functor * of the form: * @code * struct visitor { * template * void operator()( MemberType& m ); * * template * void operator()( const MemberType& m ); * }; * @endcode */ template struct tuple { tuple(){} enum size_enum { size = 4 }; template tuple( AA&& aa, BB&& bb, CC&& cc, DD&& dd ) :a( fc::forward(aa) ), b( fc::forward(bb) ), c( fc::forward(cc) ), d( fc::forward
(dd) ) {} template void visit( V&& v ) { v(a); v(b); v(c); v(d); } template void visit( V&& v )const { v(a); v(b); v(c); v(d); } A a; B b; C c; D d; }; template<> struct tuple<> { enum size_enum { size = 0 }; template void visit( V&& v)const{}; }; template struct tuple { enum size_enum { size = 1 }; template tuple( AA&& aa ):a( fc::forward(aa) ){} tuple( const tuple& t ):a(t.a){} tuple( tuple&& t ):a(t.a){} tuple(){} template void visit( V&& v ) { v(a); } template void visit( V&& v )const { v(a); } A a; }; template struct tuple { enum size_enum { size = 2 }; template tuple( AA&& aa, BB&& bb ) :a( fc::forward(aa) ), b( fc::forward(bb) ){} tuple(){} template void visit( V&& v ) { v(a); v(b); } template void visit( V&& v )const { v(a); v(b); } A a; B b; }; template struct tuple { enum size_enum { size = 3 }; tuple(){} template tuple( AA&& aa, BB&& bb, CC&& cc ) :a( fc::forward(aa) ), b( fc::forward(bb) ), c( fc::forward(cc) ) {} template void visit( V&& v ) { v(a); v(b); v(c); } template void visit( V&& v )const { v(a); v(b); v(c); } A a; B b; C c; }; tuple<> make_tuple(); template tuple make_tuple(A&& a){ return tuple( fc::forward(a) ); } template tuple make_tuple(A&& a, B&& b){ return tuple( fc::forward(a), fc::forward(b) ); } template tuple make_tuple(A&& a, B&& b, C&& c){ return tuple( fc::forward(a), fc::forward(b), fc::forward(c) ); } template tuple make_tuple(A&& a, B&& b, C&& c, D&& d){ return tuple( fc::forward(a), fc::forward(b), fc::forward(c), fc::forward(d) ); } }