Skip to content

Commit

Permalink
240104
Browse files Browse the repository at this point in the history
  • Loading branch information
yulon committed Jan 4, 2024
1 parent 5b540a8 commit 5b4d359
Show file tree
Hide file tree
Showing 21 changed files with 411 additions and 668 deletions.
82 changes: 48 additions & 34 deletions include/rua/binary/bytes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ using const_bytes_rfinder = reverse_iterator<const_bytes_finder>;
using bytes_rfinder = reverse_iterator<bytes_finder>;

template <typename Span>
class const_bytes_base : private disable_as_to_string {
class const_bytes_util : private disable_as_to_string {
public:
any_ptr data_generic() const {
any_ptr any_data() const {
return $this()->data();
}

Expand Down Expand Up @@ -133,7 +133,7 @@ class const_bytes_base : private disable_as_to_string {
rfind(bytes_pattern, size_t start_pos = nullpos) const;

protected:
const_bytes_base() = default;
const_bytes_util() = default;

private:
const Span *$this() const {
Expand All @@ -142,7 +142,7 @@ class const_bytes_base : private disable_as_to_string {
};

template <typename Span>
class bytes_base : public const_bytes_base<Span> {
class bytes_util : public const_bytes_util<Span> {
public:
uchar *begin() {
return $this()->data();
Expand Down Expand Up @@ -260,7 +260,7 @@ class bytes_base : public const_bytes_base<Span> {
}
};

class bytes_view : public const_bytes_base<bytes_view> {
class bytes_view : public const_bytes_util<bytes_view> {
public:
constexpr bytes_view(std::nullptr_t = nullptr) : $p(nullptr), $n(0) {}

Expand Down Expand Up @@ -333,7 +333,7 @@ class bytes_view : public const_bytes_base<bytes_view> {
};

template <typename Span>
inline bytes_view const_bytes_base<Span>::slice(
inline bytes_view const_bytes_util<Span>::slice(
ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
assert(end_offset >= begin_offset);

Expand All @@ -346,24 +346,24 @@ inline bytes_view const_bytes_base<Span>::slice(
}

template <typename Span>
inline bytes_view const_bytes_base<Span>::slice(ptrdiff_t begin_offset) const {
inline bytes_view const_bytes_util<Span>::slice(ptrdiff_t begin_offset) const {
return slice(begin_offset, $this()->size());
}

template <typename Span>
inline bytes_view const_bytes_base<Span>::operator()(
inline bytes_view const_bytes_util<Span>::operator()(
ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
return slice(begin_offset, end_offset);
}

template <typename Span>
inline bytes_view
const_bytes_base<Span>::operator()(ptrdiff_t begin_offset) const {
const_bytes_util<Span>::operator()(ptrdiff_t begin_offset) const {
return slice(begin_offset);
}

template <typename Span>
inline bool const_bytes_base<Span>::equal(bytes_view target) const {
inline bool const_bytes_util<Span>::equal(bytes_view target) const {
auto sz = $this()->size();
if (sz != target.size()) {
return false;
Expand All @@ -380,11 +380,11 @@ inline bool const_bytes_base<Span>::equal(bytes_view target) const {
}

template <typename Span>
inline bool const_bytes_base<Span>::operator==(bytes_view target) const {
inline bool const_bytes_util<Span>::operator==(bytes_view target) const {
return equal(target);
}

class bytes_ref : public bytes_base<bytes_ref> {
class bytes_ref : public bytes_util<bytes_ref> {
public:
constexpr bytes_ref(std::nullptr_t = nullptr) : $p(nullptr), $n(0) {}

Expand Down Expand Up @@ -460,7 +460,7 @@ class bytes_ref : public bytes_base<bytes_ref> {

template <typename Span>
inline bytes_view
bytes_base<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
bytes_util<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
assert(end_offset >= begin_offset);

if (begin_offset == end_offset) {
Expand All @@ -472,13 +472,13 @@ bytes_base<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
}

template <typename Span>
inline bytes_view bytes_base<Span>::slice(ptrdiff_t begin_offset) const {
inline bytes_view bytes_util<Span>::slice(ptrdiff_t begin_offset) const {
return slice(begin_offset, $this()->size());
}

template <typename Span>
inline bytes_ref
bytes_base<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) {
bytes_util<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) {
assert(end_offset >= begin_offset);

if (begin_offset == end_offset) {
Expand All @@ -490,35 +490,35 @@ bytes_base<Span>::slice(ptrdiff_t begin_offset, ptrdiff_t end_offset) {
}

template <typename Span>
inline bytes_ref bytes_base<Span>::slice(ptrdiff_t begin_offset) {
inline bytes_ref bytes_util<Span>::slice(ptrdiff_t begin_offset) {
return slice(begin_offset, $this()->size());
}

template <typename Span>
inline bytes_view bytes_base<Span>::operator()(
inline bytes_view bytes_util<Span>::operator()(
ptrdiff_t begin_offset, ptrdiff_t end_offset) const {
return slice(begin_offset, end_offset);
}

template <typename Span>
inline bytes_view bytes_base<Span>::operator()(ptrdiff_t begin_offset) const {
inline bytes_view bytes_util<Span>::operator()(ptrdiff_t begin_offset) const {
return slice(begin_offset);
}

template <typename Span>
inline bytes_ref
bytes_base<Span>::operator()(ptrdiff_t begin_offset, ptrdiff_t end_offset) {
bytes_util<Span>::operator()(ptrdiff_t begin_offset, ptrdiff_t end_offset) {
return slice(begin_offset, end_offset);
}

template <typename Span>
inline bytes_ref bytes_base<Span>::operator()(ptrdiff_t begin_offset) {
inline bytes_ref bytes_util<Span>::operator()(ptrdiff_t begin_offset) {
return slice(begin_offset);
}

template <typename Span>
template <typename... SrcArgs>
inline size_t bytes_base<Span>::copy(SrcArgs &&...src) {
inline size_t bytes_util<Span>::copy(SrcArgs &&...src) {
bytes_view src_b(std::forward<SrcArgs>(src)...);
auto cp_sz =
src_b.size() < $this()->size() ? src_b.size() : $this()->size();
Expand Down Expand Up @@ -610,7 +610,7 @@ inline bytes_ref as_writable_bytes(T &&data) {
}

template <typename Bytes>
inline string_view as_string(const const_bytes_base<Bytes> &b) {
inline string_view as_string(const const_bytes_util<Bytes> &b) {
return static_cast<const Bytes &>(b).size()
? string_view(
reinterpret_cast<const char *>(
Expand Down Expand Up @@ -722,7 +722,7 @@ class bytes : public bytes_ref {
};

template <typename Span>
inline bytes const_bytes_base<Span>::reverse() const {
inline bytes const_bytes_util<Span>::reverse() const {
auto n = $this()->size();
bytes r(n);
auto p = $this()->data();
Expand All @@ -735,7 +735,7 @@ inline bytes const_bytes_base<Span>::reverse() const {

template <typename Span>
template <size_t Unit>
inline bytes const_bytes_base<Span>::reverse() const {
inline bytes const_bytes_util<Span>::reverse() const {
auto n = $this()->size();
bytes r(n);
auto p = $this()->data();
Expand Down Expand Up @@ -878,7 +878,7 @@ class bytes_pattern {
};

template <typename Span>
inline optional<size_t> const_bytes_base<Span>::index_of(
inline optional<size_t> const_bytes_util<Span>::index_of(
const bytes_pattern &pat, size_t start_pos) const {

auto sz = $this()->size();
Expand Down Expand Up @@ -935,7 +935,7 @@ inline optional<size_t> const_bytes_base<Span>::index_of(
}

template <typename Span>
inline optional<size_t> const_bytes_base<Span>::last_index_of(
inline optional<size_t> const_bytes_util<Span>::last_index_of(
const bytes_pattern &pat, size_t start_pos) const {

auto sz = $this()->size();
Expand Down Expand Up @@ -1143,46 +1143,60 @@ class basic_bytes_finder : private wandering_iterator {

template <typename Span>
inline const_bytes_finder
const_bytes_base<Span>::find(bytes_pattern pat, size_t start_pos) const {
const_bytes_util<Span>::find(bytes_pattern pat, size_t start_pos) const {
return const_bytes_finder::find(*$this(), std::move(pat), {}, start_pos);
}

template <typename Span>
inline const_bytes_rfinder
const_bytes_base<Span>::rfind(bytes_pattern pat, size_t start_pos) const {
const_bytes_util<Span>::rfind(bytes_pattern pat, size_t start_pos) const {
return const_bytes_rfinder(
const_bytes_finder::rfind(*$this(), std::move(pat), {}, start_pos));
}

template <typename Span>
inline bytes_finder
bytes_base<Span>::find(bytes_pattern pat, size_t start_pos) {
bytes_util<Span>::find(bytes_pattern pat, size_t start_pos) {
return bytes_finder::find(*$this(), std::move(pat), {}, start_pos);
}

template <typename Span>
inline const_bytes_finder
bytes_base<Span>::find(bytes_pattern pat, size_t start_pos) const {
bytes_util<Span>::find(bytes_pattern pat, size_t start_pos) const {
return const_bytes_finder::find(*$this(), std::move(pat), {}, start_pos);
}

template <typename Span>
inline bytes_rfinder
bytes_base<Span>::rfind(bytes_pattern pat, size_t start_pos) {
bytes_util<Span>::rfind(bytes_pattern pat, size_t start_pos) {
return bytes_rfinder(
bytes_finder::rfind(*$this(), std::move(pat), {}, start_pos));
}

template <typename Span>
inline const_bytes_rfinder
bytes_base<Span>::rfind(bytes_pattern pat, size_t start_pos) const {
bytes_util<Span>::rfind(bytes_pattern pat, size_t start_pos) const {
return const_bytes_rfinder(
const_bytes_finder::rfind(*$this(), std::move(pat), {}, start_pos));
}

class writeable_bytes : public bytes_ref {
public:
constexpr writeable_bytes(std::nullptr_t = nullptr) : bytes_ref(), $b() {}

writeable_bytes(bytes_ref br) : bytes_ref(br), $b() {}

writeable_bytes(bytes &&b) : bytes_ref(), $b(std::move(b)) {
*static_cast<bytes_ref *>(this) = $b;
}

private:
bytes $b;
};

template <typename Derived, size_t Size = size_of<Derived>::value>
class enable_bytes_accessor
: public bytes_base<enable_bytes_accessor<Derived, Size>> {
: public bytes_util<enable_bytes_accessor<Derived, Size>> {
public:
uchar *data() {
return reinterpret_cast<uchar *>(static_cast<Derived *>(this));
Expand All @@ -1202,7 +1216,7 @@ class enable_bytes_accessor
};

template <size_t Size, size_t Align = Size + Size % 2>
class bytes_block : public bytes_base<bytes_block<Size, Align>> {
class bytes_block : public bytes_util<bytes_block<Size, Align>> {
public:
template <typename... Bytes>
constexpr bytes_block(Bytes... byts) : $raw{static_cast<uchar>(byts)...} {}
Expand Down
2 changes: 1 addition & 1 deletion include/rua/conc/await.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ _await_suspend(Awaiter &&awaiter, Callback callback) {
};
coroutine_handle<promise_type> co;
};
auto cb = make_move_only(callback);
auto cb = make_move_only(std::move(callback));
return std::forward<Awaiter>(awaiter).await_suspend(
([cb]() -> callback_coroutine { co_return cb(); })().co);
}
Expand Down
7 changes: 4 additions & 3 deletions include/rua/conc/future.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace rua {

RUA_CVAR strv_error err_unpromised("unpromised");
RUA_CVAR const strv_error err_unpromised("unpromised");

template <typename Promise, typename PromiseValue>
struct _future_promise_returner {
Expand Down Expand Up @@ -74,10 +74,11 @@ class future : private enable_await_operators {

////////////////////////////////////////////////////////////////////////

constexpr future() : $v(err_unpromised) {}
future() : $v(err_unpromised) {}

RUA_TMPL_FWD_CTOR(Args, RUA_A(expected<T>), future)
future(Args &&...args) : $v(std::forward<Args>(args)...) {}
future(Args &&...args) :
$v(expected<T>(std::forward<Args>(args)...).vrt()) {}

RUA_TMPL_FWD_CTOR_IL(U, Args, T)
future(std::initializer_list<U> il, Args &&...args) :
Expand Down
1 change: 1 addition & 0 deletions include/rua/conc/promise.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ class newable_promise : public promise<T, Extend> {

virtual ~newable_promise() = default;

protected:
void on_destroy() noexcept override {
delete this;
}
Expand Down
30 changes: 17 additions & 13 deletions include/rua/error.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,20 @@ class error_base {

#ifdef RUA_HAS_EXCEPTIONS

class error_i : public interface_ptr<error_base>, public std::exception {
using _error_i_base = interface_ptr<const error_base>;

class error_i : public _error_i_base, public std::exception {
public:
error_i() = default;

RUA_TMPL_FWD_CTOR(Args, interface_ptr<error_base>, error_i)
error_i(Args &&...args) :
interface_ptr<error_base>(std::forward<Args>(args)...) {}
RUA_TMPL_FWD_CTOR(Args, _error_i_base, error_i)
error_i(Args &&...args) : _error_i_base(std::forward<Args>(args)...) {}

error_i(const error_i &src) :
interface_ptr<error_base>(
static_cast<const interface_ptr<error_base> &>(src)) {}
_error_i_base(static_cast<const _error_i_base &>(src)) {}

error_i(error_i &&src) :
interface_ptr<error_base>(
static_cast<interface_ptr<error_base> &&>(std::move(src))) {}
_error_i_base(static_cast<_error_i_base &&>(std::move(src))) {}

RUA_OVERLOAD_ASSIGNMENT(error_i)

Expand All @@ -70,7 +69,7 @@ class error_i : public interface_ptr<error_base>, public std::exception {

#else

using error_i = interface_ptr<error_base>;
using error_i = interface_ptr<const error_base>;

#endif

Expand Down Expand Up @@ -116,6 +115,8 @@ inline std::string to_string(error_i err) {
return err ? err->info() : "noerr";
}

RUA_CVAR const strv_error err_unimplemented("unimplemented");

////////////////////////////////////////////////////////////////////////////

#ifdef RUA_HAS_EXCEPTIONS
Expand Down Expand Up @@ -342,8 +343,10 @@ class expected<void> {
if (v.template type_is<void>()) {
return;
}
auto r = std::forward<Variant>(v).visit(
[this](error_i err) { $err = std::move(err); });
auto r = std::forward<Variant>(v).visit([this](error_i err) {
assert(err);
$err = std::move(err);
});
assert(r);
}

Expand Down Expand Up @@ -376,11 +379,12 @@ class expected<void> {
}

variant<void, error_i> vrt() && {
return std::move($err);
return $err ? variant<void, error_i>(std::move($err))
: variant<void, error_i>();
}

variant<void, error_i> vrt() const & {
return $err;
return $err ? variant<void, error_i>($err) : variant<void, error_i>();
}

void reset() {
Expand Down
Loading

0 comments on commit 5b4d359

Please sign in to comment.