forked from OctaForge/libostd
stl-like initializer list interface (allow octastd to be used with stl outside of octaforge)
parent
1371a32db7
commit
08bb790612
|
@ -185,21 +185,21 @@ namespace octa {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T min(InitializerList<T> il) {
|
inline T min(InitializerList<T> il) {
|
||||||
return min_element(il.each()).first();
|
return min_element(each(il)).first();
|
||||||
}
|
}
|
||||||
template<typename T, typename C>
|
template<typename T, typename C>
|
||||||
inline T min(InitializerList<T> il, C compare) {
|
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>
|
template<typename T>
|
||||||
inline T max(InitializerList<T> il) {
|
inline T max(InitializerList<T> il) {
|
||||||
return max_element(il.each()).first();
|
return max_element(each(il)).first();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename C>
|
template<typename T, typename C>
|
||||||
inline T max(InitializerList<T> il, C compare) {
|
inline T max(InitializerList<T> il, C compare) {
|
||||||
return max_element(il.each(), compare).first();
|
return max_element(each(il), compare).first();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clamp */
|
/* clamp */
|
||||||
|
|
|
@ -33,11 +33,8 @@ namespace std {
|
||||||
|
|
||||||
size_t size() const { return p_len; }
|
size_t size() const { return p_len; }
|
||||||
|
|
||||||
const T *data() const { return p_buf; }
|
const T *begin() const { return p_buf; }
|
||||||
|
const T *end() const { return p_buf + p_len; }
|
||||||
octa::PointerRange<const T> each() {
|
|
||||||
return octa::PointerRange<const T>(p_buf, p_len);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,8 +42,8 @@ namespace octa {
|
||||||
template<typename T> using InitializerList = std::initializer_list<T>;
|
template<typename T> using InitializerList = std::initializer_list<T>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
auto each(InitializerList<T> init) -> decltype(init.each()) {
|
PointerRange<const T> each(InitializerList<T> init) {
|
||||||
return init.each();
|
return PointerRange<const T>(init.begin(), init.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,8 +88,8 @@ namespace octa {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector(InitializerList<T> v): Vector() {
|
Vector(InitializerList<T> v): Vector() {
|
||||||
size_t len = v.size();
|
size_t len = v.end() - v.begin();
|
||||||
const T *ptr = v.data();
|
const T *ptr = v.begin();
|
||||||
reserve(len);
|
reserve(len);
|
||||||
for (size_t i = 0; i < len; ++i)
|
for (size_t i = 0; i < len; ++i)
|
||||||
new (&p_buf[i]) T(ptr[i]);
|
new (&p_buf[i]) T(ptr[i]);
|
||||||
|
@ -143,12 +143,12 @@ namespace octa {
|
||||||
|
|
||||||
Vector<T> &operator=(InitializerList<T> il) {
|
Vector<T> &operator=(InitializerList<T> il) {
|
||||||
clear();
|
clear();
|
||||||
size_t ilen = il.size();
|
size_t ilen = il.end() - il.begin();
|
||||||
reserve(ilen);
|
reserve(ilen);
|
||||||
if (octa::IsPod<T>()) {
|
if (octa::IsPod<T>()) {
|
||||||
memcpy(p_buf, il.data(), ilen);
|
memcpy(p_buf, il.begin(), ilen);
|
||||||
} else {
|
} 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) {
|
while (ibuf != last) {
|
||||||
new (buf++) T(*ibuf++);
|
new (buf++) T(*ibuf++);
|
||||||
}
|
}
|
||||||
|
@ -295,7 +295,7 @@ namespace octa {
|
||||||
}
|
}
|
||||||
|
|
||||||
T *insert(size_t idx, InitializerList<T> il) {
|
T *insert(size_t idx, InitializerList<T> il) {
|
||||||
return insert_range(idx, il.each());
|
return insert_range(idx, octa::each(il));
|
||||||
}
|
}
|
||||||
|
|
||||||
RangeType each() {
|
RangeType each() {
|
||||||
|
|
Loading…
Reference in New Issue