/* OctaSTD extensions for std::vector. * * This file is part of OctaSTD. See COPYING.md for futher information. */ #ifndef OSTD_VECTOR_HH #define OSTD_VECTOR_HH #include #include #include "ostd/range.hh" namespace ostd { template struct ranged_traits> { static PointerRange iter(std::vector &v) { return PointerRange{v.data(), v.size()}; } }; template struct ranged_traits const> { static PointerRange iter(std::vector const &v) { return PointerRange{v.data(), v.size()}; } }; template inline std::vector make_vector(R range) { std::vector ret; using C = RangeCategory; if constexpr(std::is_convertible_v) { /* finite random access or contiguous */ auto h = range.half(); ret.insert(ret.end(), h, h + range.size()); } else { /* infinite random access and below */ for (; !range.empty(); range.pop_front()) { ret.push_back(range.front()); } } return ret; } template inline std::vector> make_vector(R &&range) { return make_vector>(std::forward(range)); } } /* namespace ostd */ #endif