mmdeploy/csrc/experimental/collection.h

94 lines
2.4 KiB
C
Raw Normal View History

Merge sdk (#251) * check in cmake * move backend_ops to csrc/backend_ops * check in preprocess, model, some codebase and their c-apis * check in CMakeLists.txt * check in parts of test_csrc * commit everything else * add readme * update core's BUILD_INTERFACE directory * skip codespell on third_party * update trt_net and ort_net's CMakeLists * ignore clion's build directory * check in pybind11 * add onnx.proto. Remove MMDeploy's dependency on ncnn's source code * export MMDeployTargets only when MMDEPLOY_BUILD_SDK is ON * remove useless message * target include directory is wrong * change target name from mmdeploy_ppl_net to mmdeploy_pplnn_net * skip install directory * update project's cmake * remove useless code * set CMAKE_BUILD_TYPE to Release by force if it isn't set by user * update custom ops CMakeLists * pass object target's source lists * fix lint end-of-file * fix lint: trailing whitespace * fix codespell hook * remove bicubic_interpolate to csrc/backend_ops/ * set MMDEPLOY_BUILD_SDK OFF * change custom ops build command * add spdlog installation command * update docs on how to checkout pybind11 * move bicubic_interpolate to backend_ops/tensorrt directory * remove useless code * correct cmake * fix typo * fix typo * fix install directory * correct sdk's readme * set cub dir when cuda version < 11.0 * change directory where clang-format will apply to * fix build command * add .clang-format * change clang-format style from google to file * reformat csrc/backend_ops * format sdk's code * turn off clang-format for some files * add -Xcompiler=-fno-gnu-unique * fix trt topk initialize * check in config for sdk demo * update cmake script and csrc's readme * correct config's path * add cuda include directory, otherwise compile failed in case of tensorrt8.2 * clang-format onnx2ncnn.cpp Co-authored-by: zhangli <lzhang329@gmail.com> Co-authored-by: grimoire <yaoqian@sensetime.com>
2021-12-07 10:57:55 +08:00
// Copyright (c) OpenMMLab. All rights reserved.
#ifndef MMDEPLOY_SRC_EXPERIMENTAL_COLLECTION_H_
#define MMDEPLOY_SRC_EXPERIMENTAL_COLLECTION_H_
#include "token.h"
namespace mmdeploy {
class Collection {
public:
template <typename... Args>
friend Collection& operator<<(Collection& c, const Token<Args...>& value) {
c.put(value);
return c;
}
template <typename... Args>
friend const Collection& operator>>(const Collection& c, Token<Args...>& value) {
c.get(value);
return c;
}
template <typename T>
Result<T> maybe() const {
T token;
if (get(token)) {
return token;
}
return Status(eFail);
}
private:
std::vector<std::string> keys_;
std::vector<std::shared_ptr<void>> values_;
template <typename... Args>
void put(const Token<Args...>& value) {
keys_.push_back(Token<Args...>::key());
values_.push_back(std::make_shared<Token<Args...>>(value));
}
template <typename... Args>
bool get(Token<Args...>& value) const {
for (int i = 0; i < keys_.size(); ++i) {
if (keys_[i] == Token<Args...>::key()) {
value = *static_cast<Token<Args...>*>(values_[i].get());
return true;
}
}
return false;
}
};
namespace detail {
template <typename T>
struct function_traits {
template <typename R, typename... As>
static std::tuple<As...> get_args(std::function<R(As...)>);
template <typename R, typename... Args>
static R get_ret(std::function<R(Args...)>);
using args_t = decltype(get_args(std::function{std::declval<T>()}));
using ret_t = decltype(get_ret(std::function{std::declval<T>()}));
};
// TODO: obtain first error
// TODO: combine all errors
template <typename F, typename... Args, typename Ret = std::invoke_result_t<F, Args...>>
Result<Ret> Apply(F&& f, const Result<Args>&... args) {
if ((... && args)) {
return std::invoke(std::forward<F>(f), args.value()...);
}
return Status(eFail);
}
template <typename F, typename... Args, typename Ret = std::invoke_result_t<F, Args...>>
Result<Ret> ApplyImpl(F&& f, const Collection& c, std::tuple<Args...>*) {
return Apply(std::forward<F>(f), c.maybe<Args>()...);
}
} // namespace detail
template <typename F, typename Args = typename detail::function_traits<F>::args_t>
decltype(auto) Apply(F&& f, const Collection& c) {
return detail::ApplyImpl(std::forward<F>(f), c, std::add_pointer_t<Args>{});
}
} // namespace mmdeploy
#endif // MMDEPLOY_SRC_EXPERIMENTAL_COLLECTION_H_