add 'result'

This commit is contained in:
mutouyun 2022-04-17 11:42:04 +08:00
parent 85931e7d20
commit e5f722937e
6 changed files with 138 additions and 2 deletions

16
include/libipc/mmap.h Normal file
View File

@ -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_

37
include/libipc/result.h Normal file
View File

@ -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 <ostream> // std::ostream
#include <cstdint>
#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_

View File

@ -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_

50
src/libipc/result.cpp Normal file
View File

@ -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<std::uint64_t>(result_code_info{ok ? 1ull : 0ull, code});
}
result_code_info info_cast(std::uint64_t status) noexcept {
return horrible_cast<result_code_info>(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_

View File

@ -0,0 +1,25 @@
/**
* @file src/horrible_cast.h
* @author mutouyun (orz@orzz.org)
* @date 2022-04-17
*/
#pragma once
#include <type_traits> // std::decay_t
#include <utility>
#include "libipc/def.h"
LIBIPC_NAMESPACE_BEG_
template <typename T, typename U>
constexpr auto horrible_cast(U &&in) noexcept
-> std::enable_if_t<(sizeof(T) == sizeof(std::decay_t<U>)), T> {
union {
std::decay_t<U> in;
T out;
} u {std::forward<U>(in)};
return u.out;
}
LIBIPC_NAMESPACE_END_

View File

@ -58,7 +58,7 @@ auto clear(T *p) noexcept -> std::enable_if_t<!is_comfortable<T>::value> {
template <typename T>
class Obj {
public:
public:
template <typename... A>
static T *make(A &&... args) {
return pimpl::make<T>(std::forward<A>(args)...);