2017-01-25 00:44:22 +00:00
|
|
|
/* OctaSTD extensions for std::vector.
|
2015-04-05 23:05:21 +00:00
|
|
|
*
|
2015-04-12 20:41:02 +00:00
|
|
|
* This file is part of OctaSTD. See COPYING.md for futher information.
|
2015-04-05 23:05:21 +00:00
|
|
|
*/
|
|
|
|
|
2015-07-13 19:08:55 +00:00
|
|
|
#ifndef OSTD_VECTOR_HH
|
|
|
|
#define OSTD_VECTOR_HH
|
2015-04-05 23:05:21 +00:00
|
|
|
|
2017-01-25 00:44:22 +00:00
|
|
|
#include <vector>
|
2015-04-14 21:16:06 +00:00
|
|
|
|
2015-07-13 19:08:55 +00:00
|
|
|
#include "ostd/range.hh"
|
2015-04-05 23:05:21 +00:00
|
|
|
|
2015-07-13 19:07:14 +00:00
|
|
|
namespace ostd {
|
2015-06-03 23:06:43 +00:00
|
|
|
|
2017-01-25 00:44:22 +00:00
|
|
|
template<typename T>
|
2017-01-25 23:27:54 +00:00
|
|
|
struct ranged_traits<std::vector<T>> {
|
|
|
|
static PointerRange<T> iter(std::vector<T> &v) {
|
|
|
|
return PointerRange<T>{v.data(), v.size()};
|
|
|
|
}
|
|
|
|
};
|
2015-07-12 23:24:14 +00:00
|
|
|
|
2017-01-25 00:44:22 +00:00
|
|
|
template<typename T>
|
2017-01-25 23:27:54 +00:00
|
|
|
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()};
|
|
|
|
}
|
|
|
|
};
|
2015-07-12 23:24:14 +00:00
|
|
|
|
2017-01-25 00:44:22 +00:00
|
|
|
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;
|
2015-07-12 23:24:14 +00:00
|
|
|
}
|
|
|
|
|
2017-01-25 00:44:22 +00:00
|
|
|
template<typename R>
|
|
|
|
inline std::vector<RangeValue<R>> make_vector(R range) {
|
|
|
|
return make_vector<RangeValue<R>>(std::move(range));
|
2015-07-12 23:24:14 +00:00
|
|
|
}
|
|
|
|
|
2015-07-13 19:07:14 +00:00
|
|
|
} /* namespace ostd */
|
2015-04-05 23:05:21 +00:00
|
|
|
|
2016-02-07 21:17:15 +00:00
|
|
|
#endif
|