Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Refactor/better error codes#18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
edd214c1616b1cf9aef38be05f7b6ea7683f4bf824b8332538b235ba176158d2b63c69a5ce3509375730ba2838b27e1913File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| #pragma once | ||
| #include "status_codes.h" | ||
| #include "status_code.h" | ||
| #include <concepts> | ||
| #include <string> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| #pragma once | ||
| #include "status_codes.h" | ||
| #include "status_code.h" | ||
| #include <concepts> | ||
| #include <expected> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| #pragma once | ||
| #include <cstdint> | ||
| #include <string_view> | ||
| namespace cpp_core::status_codes | ||
| { | ||
| namespace detail | ||
| { | ||
| using ValueType = std::int64_t; | ||
| inline constexpr ValueType kCategoryMultiplier{100}; | ||
| template <typename Category, ValueType NumericValue> struct Code | ||
| { | ||
| static constexpr ValueType kValue = NumericValue; | ||
| std::string_view kName; // NOLINT(readability-identifier-naming) | ||
| // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) | ||
| constexpr operator ValueType() const noexcept | ||
| { | ||
| return kValue; | ||
| } | ||
| [[nodiscard]] constexpr auto value() const noexcept -> ValueType | ||
| { | ||
| return kValue; | ||
| } | ||
| [[nodiscard]] constexpr auto name() const noexcept -> std::string_view | ||
| { | ||
| return kName; | ||
| } | ||
| [[nodiscard]] constexpr auto category() const noexcept -> std::string_view | ||
| { | ||
| return Category::kCategoryName; | ||
| } | ||
| }; | ||
| template <typename Derived> struct CategoryBase | ||
| { | ||
| private: | ||
| constexpr CategoryBase() = default; | ||
| protected: | ||
| template <ValueType LocalCode> static consteval auto computeValue() -> ValueType | ||
| { | ||
| static_assert(Derived::kCategoryCode >= 0, "Category code must not be negative"); | ||
| static_assert(LocalCode >= 0, "Code index must not be negative"); | ||
| static_assert(LocalCode < kCategoryMultiplier, "Category overflow (max 99 codes)"); | ||
| static_assert(Derived::kCategoryCode <= | ||
| (std::numeric_limits<ValueType>::max() - kCategoryMultiplier + 1) / kCategoryMultiplier, | ||
| "Category code too large, multiplication would overflow"); | ||
| return -((Derived::kCategoryCode * kCategoryMultiplier) + LocalCode); | ||
| } | ||
| template <ValueType LocalCode> using Code = detail::Code<Derived, computeValue<LocalCode>()>; | ||
| friend Derived; | ||
| }; | ||
| } // namespace detail | ||
| struct StatusCode | ||
| { | ||
| using ValueType = detail::ValueType; | ||
| static constexpr ValueType kSuccess = 0; | ||
| struct Configuration : detail::CategoryBase<Configuration> | ||
| { | ||
| static constexpr ValueType kCategoryCode = 1; | ||
| static constexpr std::string_view kCategoryName{"Configuration"}; | ||
| static constexpr Code<0> kSetBaudrateError{"SetBaudrateError"}; | ||
| static constexpr Code<1> kSetDataBitsError{"SetDataBitsError"}; | ||
| static constexpr Code<2> kSetParityError{"SetParityError"}; | ||
| static constexpr Code<3> kSetStopBitsError{"SetStopBitsError"}; | ||
| static constexpr Code<4> kSetFlowControlError{"SetFlowControlError"}; | ||
| static constexpr Code<5> kSetTimeoutError{"SetTimeoutError"}; | ||
| }; | ||
| struct Connection : detail::CategoryBase<Connection> | ||
| { | ||
| static constexpr ValueType kCategoryCode = 2; | ||
| static constexpr std::string_view kCategoryName{"Connection"}; | ||
| static constexpr Code<0> kNotFoundError{"NotFoundError"}; | ||
| static constexpr Code<1> kInvalidHandleError{"InvalidHandleError"}; | ||
| static constexpr Code<2> kCloseHandleError{"CloseHandleError"}; | ||
| }; | ||
| struct Io : detail::CategoryBase<Io> | ||
| { | ||
| static constexpr ValueType kCategoryCode = 3; | ||
| static constexpr std::string_view kCategoryName{"Io"}; | ||
| static constexpr Code<0> kReadError{"ReadError"}; | ||
| static constexpr Code<1> kWriteError{"WriteError"}; | ||
| static constexpr Code<2> kAbortReadError{"AbortReadError"}; | ||
| static constexpr Code<3> kAbortWriteError{"AbortWriteError"}; | ||
| static constexpr Code<4> kBufferError{"BufferError"}; | ||
| static constexpr Code<5> kClearBufferInError{"ClearBufferInError"}; | ||
| static constexpr Code<6> kClearBufferOutError{"ClearBufferOutError"}; | ||
| }; | ||
| struct Control : detail::CategoryBase<Control> | ||
| { | ||
| static constexpr ValueType kCategoryCode = 4; | ||
| static constexpr std::string_view kCategoryName{"Control"}; | ||
| static constexpr Code<0> kSetDtrError{"SetDtrError"}; | ||
| static constexpr Code<1> kSetRtsError{"SetRtsError"}; | ||
| static constexpr Code<2> kGetModemStatusError{"GetModemStatusError"}; | ||
| static constexpr Code<3> kSendBreakError{"SendBreakError"}; | ||
| static constexpr Code<4> kGetStateError{"GetStateError"}; | ||
| static constexpr Code<5> kSetStateError{"SetStateError"}; | ||
| }; | ||
| [[nodiscard]] static constexpr auto isError(ValueType code) noexcept -> bool | ||
| { | ||
| return code < 0; | ||
| } | ||
| [[nodiscard]] static constexpr auto isSuccess(ValueType code) noexcept -> bool | ||
| { | ||
| return code >= 0; | ||
| } | ||
| template <typename Category> [[nodiscard]] static constexpr auto belongsTo(ValueType code) noexcept -> bool | ||
| { | ||
| return code < 0 && (-code) / detail::kCategoryMultiplier == Category::kCategoryCode; | ||
| } | ||
| }; | ||
| } // namespace cpp_core::status_codes | ||
| namespace cpp_core | ||
| { | ||
| using StatusCodes = ::cpp_core::status_codes::detail::ValueType; | ||
| using ::cpp_core::status_codes::StatusCode; | ||
| } // namespace cpp_core |
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.