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 {
RearrangeMeta::RearrangeMeta(std::vector<ptrdiff_t> meta)
: _meta(std::move(meta)) {}
std::optional<RearrangeMeta> RearrangeMeta::create(
Result<RearrangeMeta> RearrangeMeta::create(
const size_t *shape,
const ptrdiff_t *dst_strides_,
const ptrdiff_t *src_strides_,
......@@ -32,7 +32,9 @@ std::optional<RearrangeMeta> RearrangeMeta::create(
// 剔除初始的 1 长维度
if (shape[i] != 1) {
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});
}
}
......@@ -81,7 +83,7 @@ std::optional<RearrangeMeta> RearrangeMeta::create(
for (ptrdiff_t i = ndim; i > 0; --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; }
......
#ifndef __INFINIUTILS_REARRANGE_H__
#define __INFINIUTILS_REARRANGE_H__
#include <optional>
#include <stddef.h>
#include "result.hpp"
#include <cstddef>
#include <vector>
namespace utils {
......@@ -12,7 +12,7 @@ class RearrangeMeta {
RearrangeMeta(std::vector<ptrdiff_t>);
public:
static std::optional<RearrangeMeta> create(
static Result<RearrangeMeta> create(
const size_t *shape,
const ptrdiff_t *dst_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