diff --git a/include/libipc/mmap.h b/include/libipc/mmap.h new file mode 100644 index 0000000..01c61c5 --- /dev/null +++ b/include/libipc/mmap.h @@ -0,0 +1,16 @@ +/** + * @file mmap.h + * @author mutouyun (orz@orzz.org) + * @brief Define the methods of memory-mapped file I/O + * @date 2022-04-17 + */ +#pragma once + +#include "libipc/def.h" +#include "libipc/result.h" + +LIBIPC_NAMESPACE_BEG_ + + + +LIBIPC_NAMESPACE_END_ diff --git a/include/libipc/result.h b/include/libipc/result.h new file mode 100644 index 0000000..2ad7c23 --- /dev/null +++ b/include/libipc/result.h @@ -0,0 +1,37 @@ +/** + * @file result.h + * @author mutouyun (orz@orzz.org) + * @brief Define the return value type with a status code + * @date 2022-04-17 + */ +#pragma once + +#include // std::ostream +#include + +#include "libipc/def.h" +#include "libipc/export.h" + +LIBIPC_NAMESPACE_BEG_ + +class LIBIPC_EXPORT result { + std::uint64_t status_; + +public: + result() noexcept; + result(bool ok, std::uint64_t code = 0) noexcept; + + std::uint64_t code() const noexcept; + bool ok() const noexcept; + + explicit operator bool() const noexcept { + return ok(); + } + + friend bool operator==(result const &lhs, result const &rhs) noexcept; + friend bool operator!=(result const &lhs, result const &rhs) noexcept; + + friend std::ostream &operator<<(std::ostream &o, result const &r) noexcept; +}; + +LIBIPC_NAMESPACE_END_ diff --git a/include/libipc/shm.h b/include/libipc/shm.h index 212e87f..408a8aa 100644 --- a/include/libipc/shm.h +++ b/include/libipc/shm.h @@ -2,6 +2,14 @@ * @file shm.h * @author mutouyun (orz@orzz.org) * @brief Define the shared memory access interface - * @date 2022-04-03 + * @date 2022-04-17 */ #pragma once + +#include "libipc/def.h" + +LIBIPC_NAMESPACE_BEG_ + + + +LIBIPC_NAMESPACE_END_ diff --git a/src/libipc/result.cpp b/src/libipc/result.cpp new file mode 100644 index 0000000..1110fe9 --- /dev/null +++ b/src/libipc/result.cpp @@ -0,0 +1,50 @@ + +#include "libipc/result.h" +#include "libipc/utility/horrible_cast.h" + +LIBIPC_NAMESPACE_BEG_ +namespace { + +struct result_code_info { + std::uint64_t ok : 1; + std::uint64_t code: 63; +}; + +std::uint64_t make_status(bool ok, std::uint64_t code) noexcept { + return horrible_cast(result_code_info{ok ? 1ull : 0ull, code}); +} + +result_code_info info_cast(std::uint64_t status) noexcept { + return horrible_cast(status); +} + +} // namespace + +result::result() noexcept + : result(false, 0) {} + +result::result(bool ok, std::uint64_t code) noexcept + : status_(make_status(ok, code)) {} + +std::uint64_t result::code() const noexcept { + return info_cast(status_).code; +} + +bool result::ok() const noexcept { + return info_cast(status_).ok != 0; +} + +bool operator==(result const &lhs, result const &rhs) noexcept { + return lhs.status_ == rhs.status_; +} + +bool operator!=(result const &lhs, result const &rhs) noexcept { + return lhs.status_ != rhs.status_; +} + +std::ostream &operator<<(std::ostream &o, result const &r) noexcept { + o << "[" << (r.ok() ? "succ" : "fail") << ", code = " << r.code() << "]"; + return o; +} + +LIBIPC_NAMESPACE_END_ diff --git a/src/libipc/utility/horrible_cast.h b/src/libipc/utility/horrible_cast.h new file mode 100644 index 0000000..907882c --- /dev/null +++ b/src/libipc/utility/horrible_cast.h @@ -0,0 +1,25 @@ +/** + * @file src/horrible_cast.h + * @author mutouyun (orz@orzz.org) + * @date 2022-04-17 + */ +#pragma once + +#include // std::decay_t +#include + +#include "libipc/def.h" + +LIBIPC_NAMESPACE_BEG_ + +template +constexpr auto horrible_cast(U &&in) noexcept + -> std::enable_if_t<(sizeof(T) == sizeof(std::decay_t)), T> { + union { + std::decay_t in; + T out; + } u {std::forward(in)}; + return u.out; +} + +LIBIPC_NAMESPACE_END_ diff --git a/src/libipc/utility/pimpl.h b/src/libipc/utility/pimpl.h index 596fe94..5ec7af0 100644 --- a/src/libipc/utility/pimpl.h +++ b/src/libipc/utility/pimpl.h @@ -58,7 +58,7 @@ auto clear(T *p) noexcept -> std::enable_if_t::value> { template class Obj { - public: +public: template static T *make(A &&... args) { return pimpl::make(std::forward(args)...);