Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // <system_error> implementation file
  2.  
  3. // Copyright (C) 2007-2015 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 3, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25.  
  26. #define _GLIBCXX_USE_CXX11_ABI 1
  27. #define __sso_string __sso_stringxxx
  28. #include <cstring>
  29. #include <system_error>
  30. #include <bits/functexcept.h>
  31. #include <limits>
  32. #undef __sso_string
  33.  
  34. namespace
  35. {
  36.   using std::string;
  37.  
  38.   struct generic_error_category : public std::error_category
  39.   {
  40.     virtual const char*
  41.     name() const noexcept
  42.     { return "generic"; }
  43.  
  44.     _GLIBCXX_DEFAULT_ABI_TAG
  45.     virtual string
  46.     message(int i) const
  47.     {
  48.       // XXX locale issues: how does one get or set loc.
  49.       // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc)
  50.       return string(strerror(i));
  51.     }
  52.   };
  53.  
  54.   struct system_error_category : public std::error_category
  55.   {
  56.     virtual const char*
  57.     name() const noexcept
  58.     { return "system"; }
  59.  
  60.     _GLIBCXX_DEFAULT_ABI_TAG
  61.     virtual string
  62.     message(int i) const
  63.     {
  64.       // XXX locale issues: how does one get or set loc.
  65.       // _GLIBCXX_HAVE_STRERROR_L, strerror_l(i, cloc)
  66.       return string(strerror(i));
  67.     }
  68.   };
  69.  
  70.   const generic_error_category generic_category_instance{};
  71.   const system_error_category system_category_instance{};
  72. }
  73.  
  74. namespace std _GLIBCXX_VISIBILITY(default)
  75. {
  76. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  77.  
  78.   error_category::~error_category() noexcept = default;
  79.  
  80.   const error_category&
  81.   _V2::system_category() noexcept { return system_category_instance; }
  82.  
  83.   const error_category&
  84.   _V2::generic_category() noexcept { return generic_category_instance; }
  85.  
  86.   system_error::~system_error() noexcept = default;
  87.  
  88.   error_condition
  89.   error_category::default_error_condition(int __i) const noexcept
  90.   { return error_condition(__i, *this); }
  91.  
  92.   bool
  93.   error_category::equivalent(int __i,
  94.                              const error_condition& __cond) const noexcept
  95.   { return default_error_condition(__i) == __cond; }
  96.  
  97.   bool
  98.   error_category::equivalent(const error_code& __code, int __i) const noexcept
  99.   { return *this == __code.category() && __code.value() == __i; }
  100.  
  101.   error_condition
  102.   error_code::default_error_condition() const noexcept
  103.   { return category().default_error_condition(value()); }
  104.  
  105. #if _GLIBCXX_USE_CXX11_ABI
  106.   // Return error_category::message() as a COW string
  107.   __cow_string
  108.   error_category::_M_message(int i) const
  109.   {
  110.     string msg = this->message(i);
  111.     return {msg.c_str(), msg.length()};
  112.   }
  113. #endif
  114.  
  115. #if _GLIBCXX_USE_DUAL_ABI
  116. #pragma GCC diagnostic push
  117. #pragma GCC diagnostic ignored "-Wabi-tag"
  118.   // Redefine __sso_string so that we can define and export its members
  119.   // in terms of the SSO std::string.
  120.   struct __sso_string
  121.   {
  122.     struct __str
  123.     {
  124.       const char* _M_p;
  125.       size_t _M_string_length;
  126.       char _M_local_buf[16];
  127.     };
  128.  
  129.     union {
  130.       __str _M_s;
  131.       char _M_bytes[sizeof(_M_s)];
  132.       std::string _M_str;
  133.     };
  134.  
  135.     __sso_string();
  136.     __sso_string(const std::string& s);
  137.     __sso_string(const char*, size_t n);
  138.     __sso_string(const __sso_string&) noexcept;
  139.     __sso_string& operator=(const __sso_string&) noexcept;
  140.     ~__sso_string();
  141.     __sso_string(__sso_string&&) noexcept;
  142.     __sso_string& operator=(__sso_string&&) noexcept;
  143.   };
  144. #pragma GCC diagnostic pop
  145.  
  146.   __sso_string::__sso_string() : _M_str() { }
  147.  
  148. #if _GLIBCXX_USE_CXX11_ABI
  149.   static_assert(sizeof(__sso_string) == sizeof(std::string),
  150.                 "sizeof(std::string) has changed");
  151.   static_assert(alignof(__sso_string) == alignof(std::string),
  152.                 "alignof(std::string) has changed");
  153.  
  154.   // This constructor is defined in src/c++11/cow-stdexcept.cc for COW strings
  155.   __sso_string::__sso_string(const std::string& s) : _M_str(s) { }
  156. #endif
  157.  
  158.   __sso_string::__sso_string(const char* s, size_t n) : _M_str(s, n) { }
  159.  
  160.   __sso_string::__sso_string(const __sso_string& s) noexcept
  161.   : _M_str(s._M_str) { }
  162.  
  163.   __sso_string&
  164.   __sso_string::operator=(const __sso_string& s) noexcept
  165.   {
  166.     _M_str = s._M_str;
  167.     return *this;
  168.   }
  169.  
  170.   __sso_string::~__sso_string() { _M_str.~basic_string(); }
  171.  
  172.   __sso_string::__sso_string(__sso_string&& s) noexcept
  173.   : _M_str(std::move(s._M_str)) { }
  174.  
  175.   __sso_string&
  176.   __sso_string::operator=(__sso_string&& s) noexcept
  177.   {
  178.     _M_str = std::move(s._M_str);
  179.     return *this;
  180.   }
  181. #endif // _GLIBCXX_USE_DUAL_ABI
  182.  
  183. _GLIBCXX_END_NAMESPACE_VERSION
  184. } // namespace
  185.