forked from OctaForge/libostd
q66
19226d51af
This introduces ranged_traits structure, which by default works for things defining .iter(), but also allows you to override it per type at later stage, which comes in handy for std containers. This is because we can't extend the std namespace in any way and we still need to be able to add iterable functionality to std containers even at later stage than iter() is defined.
47 lines
1 KiB
C++
47 lines
1 KiB
C++
/* 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 <vector>
|
|
|
|
#include "ostd/range.hh"
|
|
|
|
namespace ostd {
|
|
|
|
template<typename T>
|
|
struct ranged_traits<std::vector<T>> {
|
|
static PointerRange<T> iter(std::vector<T> &v) {
|
|
return PointerRange<T>{v.data(), v.size()};
|
|
}
|
|
};
|
|
|
|
template<typename T>
|
|
struct ranged_traits<std::vector<T> const> {
|
|
static PointerRange<T const> iter(std::vector<T> const &v) {
|
|
return PointerRange<T const>{v.data(), v.size()};
|
|
}
|
|
};
|
|
|
|
template<typename T, typename R>
|
|
inline std::vector<T> make_vector(R range) {
|
|
/* TODO: specialize for contiguous ranges and matching value types */
|
|
std::vector<T> ret;
|
|
for (; !range.empty(); range.pop_front()) {
|
|
ret.push_back(range.front());
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template<typename R>
|
|
inline std::vector<RangeValue<R>> make_vector(R range) {
|
|
return make_vector<RangeValue<R>>(std::move(range));
|
|
}
|
|
|
|
} /* namespace ostd */
|
|
|
|
#endif
|