From 296729c780ee4b6ae051c73aa60d349f1d3f3cee Mon Sep 17 00:00:00 2001 From: Kirill Igumenshchev Date: Thu, 10 Jul 2014 04:11:12 -0700 Subject: [PATCH] added back_inserter as an overload of operator* --- stl.h | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/stl.h b/stl.h index e8fc5ed..a580f29 100644 --- a/stl.h +++ b/stl.h @@ -52,7 +52,7 @@ template auto - front (Rg&& rg) + front (Rg&& rg) -> decltype(*std::begin(rg)) { return *std::begin(rg); } @@ -116,43 +116,43 @@ // Rg << Rg2 - template + template eIF ::value, Rg&&> operator << (Rg&& rg1, Rg2&& rg2) { for (auto i=std::begin(rg2); i!=endz(rg2); ++i) detail::append_elem(std::forward(rg1), std::move(*i)); return std::forward(rg1); }; // Rg == Rg2 - template + template eIF ::value, bool> - operator == (Rg1&& rg1, Rg2&& rg2) { + operator == (Rg1&& rg1, Rg2&& rg2) { auto i1=beginz(rg1); - auto i2=beginz(rg2); + auto i2=beginz(rg2); for (; i1!=endz(rg1) && i2!=endz(rg2); ++i1, ++i2) - if (*i1!=*i2) return false; + if (*i1!=*i2) return false; if ( (i1==endz(rg1)) != (i2==endz(rg2)) ) return false; return true; }; // Rg != Rg2 - template + template eIF ::value, bool> operator != (Rg1&& rg1, Rg2&& rg2) { return ! (rg1 == rg2); }; -///// T >> Rg - // x >> Rg +///// T >> Rg + // x >> Rg template eIF ::value, Rg&&> operator >> (X&& x, Rg&& rg1) { detail::prepend_elem(std::forward(rg1), std::forward(x)); return std::forward(rg1); }; // fromRg >> toRg - template + template eIF ::value, tRn&&> operator >> (sRn&& src, tRn&& trg) { - if (std::begin(src) == endz(src)) + if (std::begin(src) == endz(src)) return std::forward(trg); auto it = endz(src); @@ -168,7 +168,7 @@ //############################################################################################## RG - X //////////////////////////////////////////////////////////////////////////////////////////////// RG - VALUE - + ///// IMPL // vector - value @@ -200,7 +200,7 @@ template void cstr2_erase_value_impl (Cstr_ptr b, Cstr_ptr e, decltype(*Cstr_ptr()) c) { - auto p=std::find(b,e,c); + auto p=std::find(b,e,c); if (p!=e) std::copy(p+1,e+1, p); }; @@ -237,7 +237,7 @@ return erase_value_impl(std::forward(rg), value, erasable_category(rg)); }; - + // map - key template eIF ::value && is_map::value, Rg> @@ -359,7 +359,7 @@ if (b==rg_e) return std::forward(rg); auto e = b; std::advance(e,size(sub_rg)); - rg.erase(b,e); + rg.erase(b,e); return std::forward(rg); }; @@ -372,7 +372,7 @@ auto b = std::search(std::begin(rg), rg_e, std::begin(sub_rg), endz(sub_rg)); if (b==rg_e) return std::forward(rg); auto e = b; - //rg.erase(b,e); + //rg.erase(b,e); std::copy(e,rg_e+1,b); return std::forward(rg); }; @@ -397,7 +397,7 @@ eIF )>::value, rg_iterator> find_elem(Rg&& rg, const F& pred) { return std::find_if(std::begin(rg), endz(rg), pred); }; - + // Rg1 / Rg2 template eIF ::value, rg_iterator> @@ -405,8 +405,8 @@ } -///// Rg / X - +///// Rg / X + // --- non callable template eIF ::value , rg_iterator> @@ -449,7 +449,7 @@ template V& back (std::pair& P) { return template V&& back (std::pair&& P) { return std::move(P.second); }; -///// ++Tpl +///// ++Tpl template typename std::tuple_element >::value-1, typename std::tuple >::type& back (typename std::tuple& Tpl) { return std::get >::value-1>(Tpl); }; @@ -461,13 +461,13 @@ template V&& back (std::pair&& P) { return std::mo back (const typename std::tuple& Tpl) { return std::get >::value-1>(Tpl); }; -///// Tpl++ +///// Tpl++ template typename std::tuple_element<0, std::tuple >::type& front (typename std::tuple& Tpl) { return std::get<0>(Tpl); }; -///// Tpl++ (const) +///// Tpl++ (const) template const typename std::tuple_element<0, std::tuple >::type& front (const typename std::tuple& Tpl) { return std::get<0>(Tpl); }; @@ -500,7 +500,7 @@ template V&& back (std::pair&& P) { return std::mo ///// --Queue template - eIF ::value, Rg&&> + eIF ::value, Rg&&> operator-- (Rg&& rg) { rg.pop(); return std::forward(rg); }; @@ -522,10 +522,11 @@ template V&& back (std::pair&& P) { return std::mo ///////////////////////////////////////////////////////////////////////////////////////////////////// GENERICS // this must be after all front(X) definitions - + template auto operator++(Rg&& rg) -> decltype(front(rg)) { return front(rg); } template auto operator++(Rg&& rg, int) -> decltype(back (rg)) { return back (rg); } + template auto operator*(Rg&& rg) -> decltype(back_inserter(rg)) { return back_inserter(rg); } ///> for quickly writing back_insert. For example: boost::copy(in,*out); }; }; #endif // RO_STL_H