add AppenderRange + make format() take rvalue reference as first argument + rvalue-ref push for vector

master
Daniel Kolesa 2015-07-04 21:09:07 +01:00
parent 0265f82998
commit 133a41850f
3 changed files with 72 additions and 4 deletions

View File

@ -894,26 +894,26 @@ namespace detail {
} /* namespace detail */
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) {
return octa::detail::format_impl(writer, fmtn, false, fmt, args...);
}
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 A &...args) {
return format(writer, fmtn, fmt.data(), args...);
}
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;
return format(writer, fmtn, fmt, args...);
}
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) {
octa::Size fmtn = 0;
return format(writer, fmtn, fmt.data(), args...);

View File

@ -1117,6 +1117,67 @@ ChunksRange<T> chunks(const T &it, RangeSize<T> 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
template<typename T> using RangeOf = decltype(octa::iter(octa::declval<T>()));

View File

@ -295,6 +295,13 @@ public:
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() {
if (p_len == p_cap) reserve(p_len + 1);
octa::allocator_construct(p_buf.second(), &p_buf.first()[p_len]);