From 3612acb0ef66afc84fa8ab220fd138475dbe3937 Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Fri, 6 Jul 2007 20:47:11 +0000 Subject: [PATCH] adding working converting ctors for zero length sequences [SVN r38155] --- .../fusion/sequence/container/deque/deque.hpp | 10 +++++++++- .../container/deque/detail/keyed_element.hpp | 18 ++++++++++++++++++ .../sequence/container/vector/vector10.hpp | 6 ++++++ include/boost/fusion/support/void.hpp | 8 ++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 include/boost/fusion/support/void.hpp diff --git a/include/boost/fusion/sequence/container/deque/deque.hpp b/include/boost/fusion/sequence/container/deque/deque.hpp index ababdd4c..884899f8 100644 --- a/include/boost/fusion/sequence/container/deque/deque.hpp +++ b/include/boost/fusion/sequence/container/deque/deque.hpp @@ -20,20 +20,23 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include +#include +#include namespace boost { namespace fusion { struct deque_tag; - struct void_; template struct deque @@ -63,6 +66,11 @@ namespace boost { namespace fusion { : base(seq) {} + template + deque(Sequence const& seq, typename disable_if >::type* dummy = 0) + : base(base::from_iterator(fusion::begin(seq))) + {} + template deque& operator=(deque const& rhs) diff --git a/include/boost/fusion/sequence/container/deque/detail/keyed_element.hpp b/include/boost/fusion/sequence/container/deque/detail/keyed_element.hpp index 4f032d6f..177f68ac 100644 --- a/include/boost/fusion/sequence/container/deque/detail/keyed_element.hpp +++ b/include/boost/fusion/sequence/container/deque/detail/keyed_element.hpp @@ -11,6 +11,9 @@ #include #include +#include +#include + namespace boost { namespace fusion { struct fusion_sequence_tag; @@ -21,6 +24,13 @@ namespace detail { { typedef fusion_sequence_tag tag; void get(); + + template + static nil_keyed_element + from_iterator(It const&) + { + return nil_keyed_element(); + } }; template @@ -31,6 +41,14 @@ namespace detail { typedef fusion_sequence_tag tag; using Rest::get; + template + static keyed_element + from_iterator(It const& it) + { + return keyed_element( + *it, base::from_iterator(fusion::next(it))); + } + template keyed_element(keyed_element const& rhs) : Rest(rhs.get_base()), value_(rhs.value_) diff --git a/include/boost/fusion/sequence/container/vector/vector10.hpp b/include/boost/fusion/sequence/container/vector/vector10.hpp index fa96ee56..6ff80a0c 100644 --- a/include/boost/fusion/sequence/container/vector/vector10.hpp +++ b/include/boost/fusion/sequence/container/vector/vector10.hpp @@ -47,6 +47,12 @@ namespace boost { namespace fusion typedef mpl::false_ is_view; typedef random_access_traversal_tag category; typedef mpl::int_<0> size; + + vector0() {} + + template + vector0(Sequence const& seq) + {} }; // expand vector1 to vector10 diff --git a/include/boost/fusion/support/void.hpp b/include/boost/fusion/support/void.hpp new file mode 100644 index 00000000..63275b11 --- /dev/null +++ b/include/boost/fusion/support/void.hpp @@ -0,0 +1,8 @@ +#if !defined(BOOST_FUSION_SUPPORT_VOID_20070706_2125) +#define BOOST_FUSION_SUPPORT_VOID_20070706_2125 + +namespace boost { namespace fusion { + struct void_ {}; +}} + +#endif