extended_errors.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * Simple test file for cxxomfort's
  3. * system_error feature backports.
  4. *
  5. * This example draws from the example posted in
  6. * https://en.cppreference.com/w/cpp/error/generic_category
  7. *
  8. */
  9. #include <cxxomfort/base.hpp>
  10. #include <cxxomfort/library/system_error.hpp>
  11. #include <cxxomfort/system_error.hpp>
  12. #include <cxxomfort/string_view.hpp>
  13. #include <cxxomfort/ostream.hpp>
  14. #include <iostream>
  15. #include <cerrno>
  16. #include <string>
  17. #include <fstream>
  18. #include <cxxomfort/library/type_name.hpp>
  19. namespace cxxomfort {
  20. #if 1
  21. CXXO_OPEN_ENUM_OR_ENUMCLASS(main_errors,int)
  22. #else
  23. CXXO_OPEN_TYPESAFE_ENUM(main_errors,int)
  24. #endif
  25. {
  26. main_1, main_2, main_3
  27. }
  28. #if 0
  29. CXXO_CLOSE_TYPESAFE_ENUM(main_errors,int);
  30. #else
  31. CXXO_CLOSE_ENUM_OR_ENUMCLASS(main_errors,int);
  32. #endif
  33. }
  34. namespace std {
  35. template<> struct is_error_code_enum< ::cxxomfort::main_errors>
  36. : std::true_type {};
  37. }
  38. namespace cxxomfort {
  39. struct foo_category_t : std::error_category {
  40. char const* name () const CXXO_NOEXCEPTNOTHROW { return "foo_category"; }
  41. std::string message (int e) const {
  42. return std::string("Foo_") + std::to_string(e);
  43. }
  44. };
  45. static inline
  46. std::error_category const& foo_category () CXXO_NOEXCEPT {
  47. static foo_category_t g;
  48. return g;
  49. }
  50. inline
  51. std::error_code make_error_code (main_errors const e) CXXO_NOEXCEPT {
  52. return std::error_code(explicit_cast<int>(e), foo_category());
  53. }
  54. #if (CXXOMFORT_CXX_STD<2011)
  55. inline
  56. std::error_code make_error_code (main_errors::type const e) CXXO_NOEXCEPT {
  57. main_errors m(e);
  58. return std::error_code(e, foo_category());
  59. }
  60. #endif
  61. }
  62. namespace cxl= cxxomfort::library;
  63. int main() {
  64. using namespace std;
  65. using cxxomfort::library::type_name;
  66. cxxomfort::output_info();
  67. cout<< endl;
  68. cout<< "error code foo is: "<< type_name<cxxomfort::main_errors>()<< endl;
  69. cout<< "foo's category is: "<< type_name<cxxomfort::foo_category_t>()<< endl;
  70. error_category const& foo_cat = cxxomfort::foo_category();
  71. cout<< "Category is: "<< foo_cat.name()<< endl;
  72. cout<< "Making an error code: \n";
  73. error_code efoo = make_error_code(cxxomfort::main_errors::main_1);
  74. cout<< efoo<< ", "<< efoo.message()<< endl;
  75. cout<< "\n\n";
  76. cout<< "error code misc is: "<< type_name<cxxomfort::misc_errors>()<< endl;
  77. cout<< "misc's category is: "<< type_name<cxxomfort::library::misc_errors_category_t>()<< endl;
  78. error_category const& misc_cat = cxl::misc_error_category();
  79. cout<< "Category is: "<< misc_cat.name()<< endl;
  80. cout<< "Making an error_code: \n";
  81. error_code ec = make_error_code(cxxomfort::misc_errors::unknown);
  82. cout<< ec<< ", "<< ec.message()<< endl;
  83. ec = make_error_code(cxxomfort::misc_errors::copy_constructor_failure);
  84. cout<< ec<< ", "<< ec.message()<< endl;
  85. ec= make_error_code(cxxomfort::fix::errc::value_too_large);
  86. cout<< ec<< ", "<< ec.message()<< endl;
  87. }