You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

function_base.h 1.4 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #pragma once
  2. #include <unordered_map>
  3. #include "misc.h"
  4. #include "type_info.h"
  5. // template <typename tensor_type, typename ...Arg>
  6. namespace lite {
  7. class TensorImplDft;
  8. class NetworkImplDft;
  9. namespace {
  10. template <typename class_type>
  11. struct class_type_name {
  12. std::string operator()() { return ""; }
  13. };
  14. #define ADD_STATEMENT(class_name, backend_name) \
  15. template <> \
  16. struct class_type_name<class_name> { \
  17. std::string operator()() { return #backend_name; } \
  18. }
  19. ADD_STATEMENT(TensorImplDft, Dft);
  20. ADD_STATEMENT(NetworkImplDft, Dft);
  21. #undef ADD_STATEMENT
  22. } // namespace
  23. // if it can't find the function, ignore
  24. template <typename type, typename ret_type, typename... Args>
  25. ret_type try_call_func(std::string func_name, Args... args) {
  26. mark_used_variable(func_name);
  27. mark_used_variable(args...);
  28. return nullptr;
  29. }
  30. // if it can't find the function, throw error
  31. template <typename type, typename ret_type, typename... Args>
  32. ret_type call_func(std::string func_name, Args... args) {
  33. mark_used_variable(args...);
  34. auto backend_name = class_type_name<type>()();
  35. auto msg_info = func_name + " is not aviliable in " + backend_name + " backend.";
  36. LITE_THROW(msg_info.c_str());
  37. }
  38. } // namespace lite
  39. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}