stl-like initializer list interface (allow octastd to be used with stl outside of octaforge)

master
Daniel Kolesa 2015-05-27 23:46:58 +01:00
parent 1371a32db7
commit 08bb790612
3 changed files with 14 additions and 17 deletions

View File

@ -185,21 +185,21 @@ namespace octa {
template<typename T>
inline T min(InitializerList<T> il) {
return min_element(il.each()).first();
return min_element(each(il)).first();
}
template<typename T, typename C>
inline T min(InitializerList<T> il, C compare) {
return min_element(il.each(), compare).first();
return min_element(each(il), compare).first();
}
template<typename T>
inline T max(InitializerList<T> il) {
return max_element(il.each()).first();
return max_element(each(il)).first();
}
template<typename T, typename C>
inline T max(InitializerList<T> il, C compare) {
return max_element(il.each(), compare).first();
return max_element(each(il), compare).first();
}
/* clamp */

View File

@ -33,11 +33,8 @@ namespace std {
size_t size() const { return p_len; }
const T *data() const { return p_buf; }
octa::PointerRange<const T> each() {
return octa::PointerRange<const T>(p_buf, p_len);
}
const T *begin() const { return p_buf; }
const T *end() const { return p_buf + p_len; }
};
}
@ -45,8 +42,8 @@ namespace octa {
template<typename T> using InitializerList = std::initializer_list<T>;
template<typename T>
auto each(InitializerList<T> init) -> decltype(init.each()) {
return init.each();
PointerRange<const T> each(InitializerList<T> init) {
return PointerRange<const T>(init.begin(), init.end());
}
}

View File

@ -88,8 +88,8 @@ namespace octa {
}
Vector(InitializerList<T> v): Vector() {
size_t len = v.size();
const T *ptr = v.data();
size_t len = v.end() - v.begin();
const T *ptr = v.begin();
reserve(len);
for (size_t i = 0; i < len; ++i)
new (&p_buf[i]) T(ptr[i]);
@ -143,12 +143,12 @@ namespace octa {
Vector<T> &operator=(InitializerList<T> il) {
clear();
size_t ilen = il.size();
size_t ilen = il.end() - il.begin();
reserve(ilen);
if (octa::IsPod<T>()) {
memcpy(p_buf, il.data(), ilen);
memcpy(p_buf, il.begin(), ilen);
} else {
T *buf = p_buf, *ibuf = il.data(), *last = il.data() + ilen;
T *buf = p_buf, *ibuf = il.begin(), *last = il.end();
while (ibuf != last) {
new (buf++) T(*ibuf++);
}
@ -295,7 +295,7 @@ namespace octa {
}
T *insert(size_t idx, InitializerList<T> il) {
return insert_range(idx, il.each());
return insert_range(idx, octa::each(il));
}
RangeType each() {