make put() on OutputRanges return bool

This commit is contained in:
q66 2015-07-01 21:12:45 +01:00
parent f36c35afae
commit a23525bacf
3 changed files with 27 additions and 14 deletions

View file

@ -166,7 +166,7 @@ struct IsInfiniteRandomAccessRange: IntegralConstant<bool,
namespace detail {
template<typename T, typename P>
struct OutputRangeTest {
template<typename U, void (U::*)(P)> struct Test {};
template<typename U, bool (U::*)(P)> struct Test {};
template<typename U> static char test(Test<U, &U::put> *);
template<typename U> static int test(...);
static constexpr bool value = (sizeof(test<T>(0)) == sizeof(char));
@ -559,11 +559,11 @@ public:
return p_beg[idx];
}
void put(const RangeValue<Rtype> &v) {
p_beg.range().put(v);
bool put(const RangeValue<Rtype> &v) {
return p_beg.range().put(v);
}
void put(RangeValue<Rtype> &&v) {
p_beg.range().put(octa::move(v));
bool put(RangeValue<Rtype> &&v) {
return p_beg.range().put(octa::move(v));
}
};
@ -714,8 +714,8 @@ public:
return MoveRange<T>(p_range.slice(start, end));
}
void put(const Rval &v) { p_range.put(v); }
void put(Rval &&v) { p_range.put(octa::move(v)); }
bool put(const Rval &v) { return p_range.put(v); }
bool put(Rval &&v) { return p_range.put(octa::move(v)); }
};
template<typename T>
@ -847,11 +847,15 @@ struct PointerRange: InputRange<PointerRange<T>, FiniteRandomAccessRangeTag, T>
T &operator[](octa::Size i) const { return p_beg[i]; }
/* satisfy OutputRange */
void put(const T &v) {
bool put(const T &v) {
if (empty()) return false;
*(p_beg++) = v;
return true;
}
void put(T &&v) {
bool put(T &&v) {
if (empty()) return false;
*(p_beg++) = octa::move(v);
return true;
}
private:

View file

@ -40,7 +40,13 @@ namespace detail {
FormatOutRange(const FormatOutRange &r): buf(r.buf), idx(r.idx) {}
char *buf;
octa::Size idx;
void put(char v) { if (idx < N) buf[idx++] = v; }
bool put(char v) {
if (idx < N) {
buf[idx++] = v;
return true;
}
return false;
}
};
}
@ -198,8 +204,10 @@ struct StreamRange<T, true>: InputRange<
return p_stream->tell() == s.p_stream->tell();
}
void put(T val) {
p_size += p_stream->write_bytes(&val, sizeof(T));
bool put(T val) {
octa::Size v = p_stream->write_bytes(&val, sizeof(T));
p_size += v;
return (v == sizeof(T));
}
private:

View file

@ -118,9 +118,10 @@ struct StringRangeBase: InputRange<
T &operator[](octa::Size i) const { return p_beg[i]; }
void put(T v) {
if (empty()) return;
bool put(T v) {
if (empty()) return false;
*(p_beg++) = v;
return true;
}
/* non-range methods */