Commit a0eab6bf authored by YdrMaster's avatar YdrMaster
Browse files

issue/121/feat: 添加 Result 类型


Signed-off-by: default avatarYdrMaster <ydrml@hotmail.com>
parent beaf1e8c
...@@ -13,7 +13,7 @@ namespace utils { ...@@ -13,7 +13,7 @@ namespace utils {
RearrangeMeta::RearrangeMeta(std::vector<ptrdiff_t> meta) RearrangeMeta::RearrangeMeta(std::vector<ptrdiff_t> meta)
: _meta(std::move(meta)) {} : _meta(std::move(meta)) {}
std::optional<RearrangeMeta> RearrangeMeta::create( Result<RearrangeMeta> RearrangeMeta::create(
const size_t *shape, const size_t *shape,
const ptrdiff_t *dst_strides_, const ptrdiff_t *dst_strides_,
const ptrdiff_t *src_strides_, const ptrdiff_t *src_strides_,
...@@ -32,7 +32,9 @@ std::optional<RearrangeMeta> RearrangeMeta::create( ...@@ -32,7 +32,9 @@ std::optional<RearrangeMeta> RearrangeMeta::create(
// 剔除初始的 1 长维度 // 剔除初始的 1 长维度
if (shape[i] != 1) { if (shape[i] != 1) {
auto sd = dst_strides_[i] * unit, ss = src_strides_[i] * unit; auto sd = dst_strides_[i] * unit, ss = src_strides_[i] * unit;
// assert (sd != 0) if (sd == 0) {
return Result<RearrangeMeta>(INFINI_STATUS_BAD_TENSOR_STRIDES);
}
dims.push_back(Dim{shape[i], sd, ss}); dims.push_back(Dim{shape[i], sd, ss});
} }
} }
...@@ -81,7 +83,7 @@ std::optional<RearrangeMeta> RearrangeMeta::create( ...@@ -81,7 +83,7 @@ std::optional<RearrangeMeta> RearrangeMeta::create(
for (ptrdiff_t i = ndim; i > 0; --i) { for (ptrdiff_t i = ndim; i > 0; --i) {
meta[1 + i - 1] *= meta[1 + i]; meta[1 + i - 1] *= meta[1 + i];
} }
return {RearrangeMeta(std::move(meta))}; return Result<RearrangeMeta>(meta);
} }
size_t RearrangeMeta::ndim() const { return (_meta.size() - 2) / 3; } size_t RearrangeMeta::ndim() const { return (_meta.size() - 2) / 3; }
......
#ifndef __INFINIUTILS_REARRANGE_H__ #ifndef __INFINIUTILS_REARRANGE_H__
#define __INFINIUTILS_REARRANGE_H__ #define __INFINIUTILS_REARRANGE_H__
#include <optional> #include "result.hpp"
#include <stddef.h> #include <cstddef>
#include <vector> #include <vector>
namespace utils { namespace utils {
...@@ -12,7 +12,7 @@ class RearrangeMeta { ...@@ -12,7 +12,7 @@ class RearrangeMeta {
RearrangeMeta(std::vector<ptrdiff_t>); RearrangeMeta(std::vector<ptrdiff_t>);
public: public:
static std::optional<RearrangeMeta> create( static Result<RearrangeMeta> create(
const size_t *shape, const size_t *shape,
const ptrdiff_t *dst_strides, const ptrdiff_t *dst_strides,
const ptrdiff_t *src_strides, const ptrdiff_t *src_strides,
......
#ifndef __INFINIUTILS_RESULT_H__
#define __INFINIUTILS_RESULT_H__
#include "check.h"
#include <infinicore.h>
#include <variant>
namespace utils {
template <typename T, typename = std::enable_if_t<!std::is_same_v<T, infiniStatus_t>>>
class Result {
std::variant<infiniStatus_t, T> _result;
public:
explicit Result(T value) : _result(std::move(value)) {}
explicit Result(infiniStatus_t status) : _result(status) {
if (status == INFINI_STATUS_SUCCESS) {
std::cerr << "Warning: Result created with success status but value is not set." << std::endl;
std::abort();
}
}
infiniStatus_t status() const {
return _result.index() == 0 ? std::get<0>(_result) : INFINI_STATUS_SUCCESS;
}
T take() {
return std::move(std::get<1>(_result));
}
operator bool() const {
return status() == INFINI_STATUS_SUCCESS;
}
T *operator->() {
return &std::get<1>(_result);
}
const T *operator->() const {
return &std::get<1>(_result);
}
T &operator*() {
return std::get<1>(_result);
}
const T &operator*() const {
return std::get<1>(_result);
}
};
} // namespace utils
#endif // __INFINIUTILS_RESULT_H__
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment