| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | /*!@fileAdapts `std::vector` for use with Hana.@copyright Louis Dionne 2013-2017@copyright Gonzalo Brito Gadeschi 2015Distributed under the Boost Software License, Version 1.0.(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */#ifndef BOOST_HANA_EXT_STD_VECTOR_HPP#define BOOST_HANA_EXT_STD_VECTOR_HPP#include <boost/hana/config.hpp>#include <boost/hana/equal.hpp>#include <boost/hana/fwd/core/tag_of.hpp>#include <boost/hana/less.hpp>#include <algorithm>#include <iterator>#include <memory>#include <type_traits>#include <utility>#include <vector>BOOST_HANA_NAMESPACE_BEGIN    namespace ext { namespace std { struct vector_tag; }}    template <typename T, typename Allocator>    struct tag_of<std::vector<T, Allocator>> {        using type = ext::std::vector_tag;    };    //////////////////////////////////////////////////////////////////////////    // Comparable    //////////////////////////////////////////////////////////////////////////    template <>    struct equal_impl<ext::std::vector_tag, ext::std::vector_tag> {        template <typename T1, typename A1, typename T2, typename A2>        static bool apply(std::vector<T1, A1> const& v1,                          std::vector<T2, A2> const& v2)        {            return std::equal(begin(v1), end(v1),                              begin(v2), end(v2),                              hana::equal);        }    };    //////////////////////////////////////////////////////////////////////////    // Orderable    //////////////////////////////////////////////////////////////////////////    template <>    struct less_impl<ext::std::vector_tag, ext::std::vector_tag> {        template <typename T1, typename A1, typename T2, typename A2>        static bool apply(std::vector<T1, A1> const& v1,                          std::vector<T2, A2> const& v2)        {            return std::lexicographical_compare(begin(v1), end(v1),                                                begin(v2), end(v2),                                                hana::less);        }    };#if 0    //////////////////////////////////////////////////////////////////////////    // Functor    //////////////////////////////////////////////////////////////////////////    template <>    struct transform_impl<ext::std::vector_tag> {        template <typename V, typename F>        static auto apply(V&& v, F&& f) {            using U = std::remove_cv_t<std::remove_reference_t<                decltype(f(*v.begin()))            >>;            using Alloc = typename std::remove_reference_t<V>::allocator_type;            using NewAlloc = typename std::allocator_traits<Alloc>::                             template rebind_alloc<U>;            std::vector<U, NewAlloc> result; result.reserve(v.size());            std::transform(begin(v), end(v),                           std::back_inserter(result), std::forward<F>(f));            return result;        }        template <typename T, typename Alloc, typename F>        static auto apply(std::vector<T, Alloc>&& v, F&& f)            -> std::enable_if_t<                std::is_same<                    T,                    std::remove_cv_t<std::remove_reference_t<                        decltype(f(*v.begin()))                    >>                >{}                , std::vector<T, Alloc>            >        {            // If we receive a rvalue and the function returns elements of            // the same type, we modify the vector in-place instead of            // returning a new one.            std::transform(std::make_move_iterator(begin(v)),                           std::make_move_iterator(end(v)),                           begin(v), std::forward<F>(f));            return std::move(v);        }    };#endifBOOST_HANA_NAMESPACE_END#endif // !BOOST_HANA_EXT_STD_VECTOR_HPP
 |