From 8ea30fa09153bde500322721f662481b24ea9dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 30 Apr 2009 17:28:55 +0000 Subject: [PATCH] Expand the non-variadic version of Dispatch_*_output_iterator and Is_in_tuple for up to 7 parameters --- STL_Extension/include/CGAL/iterator.h | 502 +++++++++++++++++++++++++- STL_Extension/include/CGAL/tuple.h | 88 ++++- 2 files changed, 577 insertions(+), 13 deletions(-) diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index aa2b68315ff..832c76d75f6 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -1311,6 +1311,7 @@ dispatch_or_drop_output(O... o) template < typename V, typename O > class Dispatch_output_iterator; +// Version with 2 parameters template class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ typedef Dispatch_output_iterator Self; @@ -1359,7 +1360,6 @@ dispatch_output(O1 out1,O2 out2){ return Dispatch_output_iterator,cpp0x::tuple >(out1,out2); } - //Version with DROP template < typename V, typename O > class Dispatch_or_drop_output_iterator; @@ -1396,6 +1396,506 @@ dispatch_or_drop_output(O1 out1,O2 out2){ return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2); } +//Versio with 3 parameters +template +class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ + typedef Dispatch_output_iterator Self; + +public: + typedef cpp0x::tuple Value_types_tuple; + typedef cpp0x::tuple Iterators_tuple; + typedef std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_output_iterator(O1 out1,O2 out2,O3 out3):Iterators_tuple(out1,out2,out3){} + + Self& operator=(const V1& obj){ + *cpp0x::get<0>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V2& obj){ + *cpp0x::get<1>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V3& obj){ + *cpp0x::get<2>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const Self& s){ + static_cast< Iterators_tuple& >(*this) = static_cast< const Iterators_tuple& >(s); + return *this; + } + + const Iterators_tuple& get_iterator_tuple() const + { return *this; } + +}; + + +template +inline +Dispatch_output_iterator,cpp0x::tuple > +dispatch_output(O1 out1,O2 out2,O3 out3){ + return Dispatch_output_iterator,cpp0x::tuple >(out1,out2,out3); +} + +//Version with DROP +template < typename V, typename O > +class Dispatch_or_drop_output_iterator; + + +template +class Dispatch_or_drop_output_iterator,cpp0x::tuple >: + public Dispatch_output_iterator,cpp0x::tuple > +{ + typedef Dispatch_or_drop_output_iterator Self; + typedef Dispatch_output_iterator,cpp0x::tuple > Base; + +public: + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_or_drop_output_iterator(O1 out1,O2 out2,O3 out3):Base(out1,out2,out3){} + + using Base::operator=; + + + template + Self& operator=(const T&){ + return *this; + } +}; + +template +inline +Dispatch_or_drop_output_iterator,cpp0x::tuple > +dispatch_or_drop_output(O1 out1,O2 out2,O3 out3){ + return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2,out3); +} + +//Versio with 4 parameters +template +class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ + typedef Dispatch_output_iterator Self; + +public: + typedef cpp0x::tuple Value_types_tuple; + typedef cpp0x::tuple Iterators_tuple; + typedef std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4):Iterators_tuple(out1,out2,out3,out4){} + + Self& operator=(const V1& obj){ + *cpp0x::get<0>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V2& obj){ + *cpp0x::get<1>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V3& obj){ + *cpp0x::get<2>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V4& obj){ + *cpp0x::get<3>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const Self& s){ + static_cast< Iterators_tuple& >(*this) = static_cast< const Iterators_tuple& >(s); + return *this; + } + + const Iterators_tuple& get_iterator_tuple() const + { return *this; } + +}; + + +template +inline +Dispatch_output_iterator,cpp0x::tuple > +dispatch_output(O1 out1,O2 out2,O3 out3,O4 out4){ + return Dispatch_output_iterator,cpp0x::tuple >(out1,out2,out3,out4); +} + +//Version with DROP +template < typename V, typename O > +class Dispatch_or_drop_output_iterator; + + +template +class Dispatch_or_drop_output_iterator,cpp0x::tuple >: + public Dispatch_output_iterator,cpp0x::tuple > +{ + typedef Dispatch_or_drop_output_iterator Self; + typedef Dispatch_output_iterator,cpp0x::tuple > Base; + +public: + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_or_drop_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4):Base(out1,out2,out3,out4){} + + using Base::operator=; + + + template + Self& operator=(const T&){ + return *this; + } +}; + +template +inline +Dispatch_or_drop_output_iterator,cpp0x::tuple > +dispatch_or_drop_output(O1 out1,O2 out2,O3 out3,O4 out4){ + return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2,out3,out4); +} + +//Versio with 5 parameters +template +class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ + typedef Dispatch_output_iterator Self; + +public: + typedef cpp0x::tuple Value_types_tuple; + typedef cpp0x::tuple Iterators_tuple; + typedef std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5):Iterators_tuple(out1,out2,out3,out4,out5){} + + Self& operator=(const V1& obj){ + *cpp0x::get<0>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V2& obj){ + *cpp0x::get<1>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V3& obj){ + *cpp0x::get<2>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V4& obj){ + *cpp0x::get<3>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V5& obj){ + *cpp0x::get<4>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const Self& s){ + static_cast< Iterators_tuple& >(*this) = static_cast< const Iterators_tuple& >(s); + return *this; + } + + const Iterators_tuple& get_iterator_tuple() const + { return *this; } + +}; + + +template +inline +Dispatch_output_iterator,cpp0x::tuple > +dispatch_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5){ + return Dispatch_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5); +} + +//Version with DROP +template < typename V, typename O > +class Dispatch_or_drop_output_iterator; + + +template +class Dispatch_or_drop_output_iterator,cpp0x::tuple >: + public Dispatch_output_iterator,cpp0x::tuple > +{ + typedef Dispatch_or_drop_output_iterator Self; + typedef Dispatch_output_iterator,cpp0x::tuple > Base; + +public: + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_or_drop_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5):Base(out1,out2,out3,out4,out5){} + + using Base::operator=; + + + template + Self& operator=(const T&){ + return *this; + } +}; + +template +inline +Dispatch_or_drop_output_iterator,cpp0x::tuple > +dispatch_or_drop_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5){ + return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5); +} + +//Versio with 6 parameters +template +class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ + typedef Dispatch_output_iterator Self; + +public: + typedef cpp0x::tuple Value_types_tuple; + typedef cpp0x::tuple Iterators_tuple; + typedef std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6):Iterators_tuple(out1,out2,out3,out4,out5,out6){} + + Self& operator=(const V1& obj){ + *cpp0x::get<0>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V2& obj){ + *cpp0x::get<1>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V3& obj){ + *cpp0x::get<2>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V4& obj){ + *cpp0x::get<3>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V5& obj){ + *cpp0x::get<4>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V6& obj){ + *cpp0x::get<5>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const Self& s){ + static_cast< Iterators_tuple& >(*this) = static_cast< const Iterators_tuple& >(s); + return *this; + } + + const Iterators_tuple& get_iterator_tuple() const + { return *this; } + +}; + + +template +inline +Dispatch_output_iterator,cpp0x::tuple > +dispatch_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6){ + return Dispatch_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5,out6); +} + +//Version with DROP +template < typename V, typename O > +class Dispatch_or_drop_output_iterator; + + +template +class Dispatch_or_drop_output_iterator,cpp0x::tuple >: + public Dispatch_output_iterator,cpp0x::tuple > +{ + typedef Dispatch_or_drop_output_iterator Self; + typedef Dispatch_output_iterator,cpp0x::tuple > Base; + +public: + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_or_drop_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6):Base(out1,out2,out3,out4,out5,out6){} + + using Base::operator=; + + + template + Self& operator=(const T&){ + return *this; + } +}; + +template +inline +Dispatch_or_drop_output_iterator,cpp0x::tuple > +dispatch_or_drop_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6){ + return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5,out6); +} + +//Versio with 7 parameters +template +class Dispatch_output_iterator,cpp0x::tuple >:public cpp0x::tuple{ + typedef Dispatch_output_iterator Self; + +public: + typedef cpp0x::tuple Value_types_tuple; + typedef cpp0x::tuple Iterators_tuple; + typedef std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6,O7 out7):Iterators_tuple(out1,out2,out3,out4,out5,out6,out7){} + + Self& operator=(const V1& obj){ + *cpp0x::get<0>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V2& obj){ + *cpp0x::get<1>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V3& obj){ + *cpp0x::get<2>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V4& obj){ + *cpp0x::get<3>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V5& obj){ + *cpp0x::get<4>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V6& obj){ + *cpp0x::get<5>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const V7& obj){ + *cpp0x::get<6>(static_cast(*this))++=obj; + return *this; + } + + Self& operator=(const Self& s){ + static_cast< Iterators_tuple& >(*this) = static_cast< const Iterators_tuple& >(s); + return *this; + } + + const Iterators_tuple& get_iterator_tuple() const + { return *this; } + +}; + + +template +inline +Dispatch_output_iterator,cpp0x::tuple > +dispatch_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6,O7 out7){ + return Dispatch_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5,out6,out7); +} + +//Version with DROP +template < typename V, typename O > +class Dispatch_or_drop_output_iterator; + + +template +class Dispatch_or_drop_output_iterator,cpp0x::tuple >: + public Dispatch_output_iterator,cpp0x::tuple > +{ + typedef Dispatch_or_drop_output_iterator Self; + typedef Dispatch_output_iterator,cpp0x::tuple > Base; + +public: + + Self& operator*(){ return *this; } + Self& operator++(){ return *this; } + Self& operator++(int){ return *this; } + + Dispatch_or_drop_output_iterator(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6,O7 out7):Base(out1,out2,out3,out4,out5,out6,out7){} + + using Base::operator=; + + + template + Self& operator=(const T&){ + return *this; + } +}; + +template +inline +Dispatch_or_drop_output_iterator,cpp0x::tuple > +dispatch_or_drop_output(O1 out1,O2 out2,O3 out3,O4 out4,O5 out5,O6 out6,O7 out7){ + return Dispatch_or_drop_output_iterator,cpp0x::tuple >(out1,out2,out3,out4,out5,out6,out7); +} + #endif CGAL_END_NAMESPACE diff --git a/STL_Extension/include/CGAL/tuple.h b/STL_Extension/include/CGAL/tuple.h index 1bdd209b361..1a48bab4340 100644 --- a/STL_Extension/include/CGAL/tuple.h +++ b/STL_Extension/include/CGAL/tuple.h @@ -84,33 +84,97 @@ struct Is_in_tuple > // Non-variadic version -template +template struct Is_in_tuple; -template -struct Is_in_tuple > +template +struct Is_in_tuple > { - static const bool value = Is_in_tuple >::value; + static const bool value = Is_in_tuple >::value; }; -template -struct Is_in_tuple > +template +struct Is_in_tuple > { - static const bool value = true; + static const bool value = Is_in_tuple >::value; }; -template -struct Is_in_tuple > +template +struct Is_in_tuple > { - static const bool value = true; + static const bool value = Is_in_tuple >::value; }; -template -struct Is_in_tuple > +template +struct Is_in_tuple > +{ + static const bool value = Is_in_tuple >::value; +}; + +template +struct Is_in_tuple > +{ + static const bool value = Is_in_tuple >::value; +}; + +template +struct Is_in_tuple > +{ + static const bool value = Is_in_tuple >::value; +}; + + +//Conclusions + +template +struct Is_in_tuple > { static const bool value = false; }; +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + +template +struct Is_in_tuple > +{ + static const bool value = true; +}; + + #endif CGAL_END_NAMESPACE