forked from OctaForge/libostd
add AppenderRange + make format() take rvalue reference as first argument + rvalue-ref push for vector
This commit is contained in:
parent
0265f82998
commit
133a41850f
|
@ -894,26 +894,26 @@ namespace detail {
|
||||||
} /* namespace detail */
|
} /* namespace detail */
|
||||||
|
|
||||||
template<typename R, typename ...A>
|
template<typename R, typename ...A>
|
||||||
static inline octa::Ptrdiff format(R writer, octa::Size &fmtn,
|
static inline octa::Ptrdiff format(R &&writer, octa::Size &fmtn,
|
||||||
const char *fmt, const A &...args) {
|
const char *fmt, const A &...args) {
|
||||||
return octa::detail::format_impl(writer, fmtn, false, fmt, args...);
|
return octa::detail::format_impl(writer, fmtn, false, fmt, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename R, typename AL, typename ...A>
|
template<typename R, typename AL, typename ...A>
|
||||||
octa::Ptrdiff format(R writer, octa::Size &fmtn,
|
octa::Ptrdiff format(R &&writer, octa::Size &fmtn,
|
||||||
const octa::AnyString<AL> &fmt,
|
const octa::AnyString<AL> &fmt,
|
||||||
const A &...args) {
|
const A &...args) {
|
||||||
return format(writer, fmtn, fmt.data(), args...);
|
return format(writer, fmtn, fmt.data(), args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename R, typename ...A>
|
template<typename R, typename ...A>
|
||||||
octa::Ptrdiff format(R writer, const char *fmt, const A &...args) {
|
octa::Ptrdiff format(R &&writer, const char *fmt, const A &...args) {
|
||||||
octa::Size fmtn = 0;
|
octa::Size fmtn = 0;
|
||||||
return format(writer, fmtn, fmt, args...);
|
return format(writer, fmtn, fmt, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename R, typename AL, typename ...A>
|
template<typename R, typename AL, typename ...A>
|
||||||
octa::Ptrdiff format(R writer, const octa::AnyString<AL> &fmt,
|
octa::Ptrdiff format(R &&writer, const octa::AnyString<AL> &fmt,
|
||||||
const A &...args) {
|
const A &...args) {
|
||||||
octa::Size fmtn = 0;
|
octa::Size fmtn = 0;
|
||||||
return format(writer, fmtn, fmt.data(), args...);
|
return format(writer, fmtn, fmt.data(), args...);
|
||||||
|
|
|
@ -1117,6 +1117,67 @@ ChunksRange<T> chunks(const T &it, RangeSize<T> chs) {
|
||||||
return ChunksRange<T>(it, chs);
|
return ChunksRange<T>(it, chs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct AppenderRange: OutputRange<AppenderRange<T>, typename T::Value> {
|
||||||
|
AppenderRange(): p_data() {}
|
||||||
|
AppenderRange(const T &v): p_data(v) {}
|
||||||
|
AppenderRange(T &&v): p_data(octa::move(v)) {}
|
||||||
|
AppenderRange(const AppenderRange &v): p_data(v.p_data) {}
|
||||||
|
AppenderRange(AppenderRange &&v): p_data(octa::move(v.p_data)) {}
|
||||||
|
|
||||||
|
AppenderRange &operator=(const AppenderRange &v) {
|
||||||
|
p_data = v.p_data;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppenderRange &operator=(AppenderRange &&v) {
|
||||||
|
p_data = octa::move(v.p_data);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppenderRange &operator=(const T &v) {
|
||||||
|
p_data = v;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppenderRange &operator=(T &&v) {
|
||||||
|
p_data = octa::move(v);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() { p_data.clear(); }
|
||||||
|
|
||||||
|
void reserve(typename T::Size cap) { p_data.reserve(cap); }
|
||||||
|
void resize(typename T::Size len) { p_data.resize(len); }
|
||||||
|
|
||||||
|
typename T::Size size() const { return p_data.size(); }
|
||||||
|
typename T::Size capacity() const { return p_data.capacity(); }
|
||||||
|
|
||||||
|
bool put(const typename T::Value &v) {
|
||||||
|
p_data.push(v);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool put(typename T::Value &&v) {
|
||||||
|
p_data.push(octa::move(v));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
T &get() { return p_data; }
|
||||||
|
private:
|
||||||
|
T p_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
AppenderRange<T> appender() {
|
||||||
|
return AppenderRange<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
AppenderRange<T> appender(T &&v) {
|
||||||
|
return AppenderRange<T>(octa::forward<T>(v));
|
||||||
|
}
|
||||||
|
|
||||||
// range of
|
// range of
|
||||||
template<typename T> using RangeOf = decltype(octa::iter(octa::declval<T>()));
|
template<typename T> using RangeOf = decltype(octa::iter(octa::declval<T>()));
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,13 @@ public:
|
||||||
return p_buf.first()[p_len++];
|
return p_buf.first()[p_len++];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
T &push(T &&v) {
|
||||||
|
if (p_len == p_cap) reserve(p_len + 1);
|
||||||
|
octa::allocator_construct(p_buf.second(),
|
||||||
|
&p_buf.first()[p_len], octa::move(v));
|
||||||
|
return p_buf.first()[p_len++];
|
||||||
|
}
|
||||||
|
|
||||||
T &push() {
|
T &push() {
|
||||||
if (p_len == p_cap) reserve(p_len + 1);
|
if (p_len == p_cap) reserve(p_len + 1);
|
||||||
octa::allocator_construct(p_buf.second(), &p_buf.first()[p_len]);
|
octa::allocator_construct(p_buf.second(), &p_buf.first()[p_len]);
|
||||||
|
|
Loading…
Reference in a new issue