// <system_error> -*- C++ -*-

// Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file system_error
 *  This is a Standard C++ Library header.
 */

#ifndef _GLIBCXX_SYSTEM_ERROR
#define _GLIBCXX_SYSTEM_ERROR 1

#pragma GCC system_header

#ifndef __GXX_EXPERIMENTAL_CXX0X__
# include <bits/c++0x_warning.h>
#else

#include <bits/c++config.h>
#include <bits/error_constants.h>
#include <iosfwd>
#include <stdexcept>

_GLIBCXX_BEGIN_NAMESPACE(std)

  class error_code;
  class error_condition;
  class error_category;
  class system_error;

  /// is_error_code_enum
  template<typename _Tp>
    struct is_error_code_enum : public false_type { };

  /// is_error_condition_enum
  template<typename _Tp>
    struct is_error_condition_enum : public false_type { };

  template<> 
    struct is_error_condition_enum<errc>
    : public true_type { };


  /// error_category
  class error_category
  {
  protected:
    error_category();

  public:
    virtual ~error_category() { }

    error_category(const error_category&) = delete;
    error_category& operator=(const error_category&) = delete;

    virtual const char* 
    name() const = 0;

    virtual string 
    message(int) const = 0;

    virtual error_condition
    default_error_condition(int __i) const;

    virtual bool 
    equivalent(int __i, const error_condition& __cond) const;

    virtual bool 
    equivalent(const error_code& __code, int __i) const;

    bool 
    operator<(const error_category& __other) const
    { return less<const error_category*>()(this, &__other); }

    bool 
    operator==(const error_category& __other) const
    { return this == &__other; }

    bool 
    operator!=(const error_category& __other) const
    { return this != &__other; }
  };

  inline error_category::error_category() = default;

  // DR 890.
  _GLIBCXX_CONST const error_category& system_category() throw();
  _GLIBCXX_CONST const error_category& generic_category() throw();

  error_code make_error_code(errc);

  template<typename _Tp>
    struct hash;

  /// error_code
  // Implementation-specific error identification
  struct error_code
  {
    error_code()
    : _M_value(0), _M_cat(&system_category()) { }

    error_code(int __v, const error_category& __cat)
    : _M_value(__v), _M_cat(&__cat) { }

    template<typename _ErrorCodeEnum>
      error_code(_ErrorCodeEnum __e,
      typename enable_if<is_error_code_enum<_ErrorCodeEnum>::value>::type* = 0)
      { *this = make_error_code(__e); }

    void 
    assign(int __v, const error_category& __cat)
    {
      _M_value = __v;
      _M_cat = &__cat; 
    }

    void 
    clear()
    { assign(0, system_category()); }

    // DR 804.
    template<typename _ErrorCodeEnum>
      typename enable_if<is_error_code_enum<_ErrorCodeEnum>::value,
			 error_code&>::type
      operator=(_ErrorCodeEnum __e)
      { return *this = make_error_code(__e); }

    int
    value() const { return _M_value; }
      
    const error_category&  
    category() const { return *_M_cat; }

    error_condition 
    default_error_condition() const;

    string 
    message() const
    { return category().message(value()); }

    explicit operator bool() const
    { return _M_value != 0 ? true : false; }

    // DR 804.
  private:
    friend class hash<error_code>;

    int            		_M_value;
    const error_category* 	_M_cat;
  };

  // 19.4.2.6 non-member functions
  inline error_code
  make_error_code(errc __e)
  { return error_code(static_cast<int>(__e), generic_category()); }

  inline bool
  operator<(const error_code& __lhs, const error_code& __rhs)
  { 
    return (__lhs.category() < __rhs.category()
	    || (__lhs.category() == __rhs.category()
		&& __lhs.value() < __rhs.value()));
  }

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e)
    { return (__os << __e.category().name() << ':' << __e.value()); }

  error_condition make_error_condition(errc);

  /// error_condition
  // Portable error identification
  struct error_condition 
  {
    error_condition()
    : _M_value(0), _M_cat(&generic_category()) { }

    error_condition(int __v, const error_category& __cat)     
    : _M_value(__v), _M_cat(&__cat) { }

    template<typename _ErrorConditionEnum>
      error_condition(_ErrorConditionEnum __e,
		      typename enable_if<is_error_condition_enum
		                      <_ErrorConditionEnum>::value>::type* = 0)
      { *this = make_error_condition(__e); }

    void
    assign(int __v, const error_category& __cat)
    {
      _M_value = __v;
      _M_cat = &__cat;
    }

    // DR 804.
    template<typename _ErrorConditionEnum>
      typename enable_if<is_error_condition_enum
			 <_ErrorConditionEnum>::value, error_condition&>::type
      operator=(_ErrorConditionEnum __e)
      { return *this = make_error_condition(__e); }

    void 
    clear()
    { assign(0, generic_category()); }

    // 19.4.3.4 observers
    int 
    value() const { return _M_value; }

    const error_category&
    category() const { return *_M_cat; }

    string 
    message() const
    { return category().message(value()); }

    explicit operator bool() const
    { return _M_value != 0 ? true : false; }

    // DR 804.
  private:
    int 			_M_value;
    const error_category* 	_M_cat;
  };

  // 19.4.3.6 non-member functions
  inline error_condition
  make_error_condition(errc __e)
  { return error_condition(static_cast<int>(__e), generic_category()); }

  inline bool 
  operator<(const error_condition& __lhs, const error_condition& __rhs)
  {
    return (__lhs.category() < __rhs.category()
	    || (__lhs.category() == __rhs.category()
		&& __lhs.value() < __rhs.value()));
  }

  // 19.4.4 Comparison operators
  inline bool
  operator==(const error_code& __lhs, const error_code& __rhs)
  { return (__lhs.category() == __rhs.category()
	    && __lhs.value() == __rhs.value()); }

  inline bool
  operator==(const error_code& __lhs, const error_condition& __rhs)
  {
    return (__lhs.category().equivalent(__lhs.value(), __rhs)
	    || __rhs.category().equivalent(__lhs, __rhs.value()));
  }

  inline bool
  operator==(const error_condition& __lhs, const error_code& __rhs)
  {
    return (__rhs.category().equivalent(__rhs.value(), __lhs)
	    || __lhs.category().equivalent(__rhs, __lhs.value()));
  }

  inline bool
  operator==(const error_condition& __lhs, const error_condition& __rhs)
  {
    return (__lhs.category() == __rhs.category()
	    && __lhs.value() == __rhs.value());
  }

  inline bool
  operator!=(const error_code& __lhs, const error_code& __rhs)
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_code& __lhs, const error_condition& __rhs)
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_condition& __lhs, const error_code& __rhs)
  { return !(__lhs == __rhs); }

  inline bool
  operator!=(const error_condition& __lhs, const error_condition& __rhs)
  { return !(__lhs == __rhs); }


  /** 
   *  @brief Thrown to indicate error code of underlying system.
   *
   *  @ingroup exceptions
   */
  class system_error : public std::runtime_error
  {
  private:
    error_code 	_M_code;

  public:
    system_error(error_code __ec = error_code())
    : runtime_error(""), _M_code(__ec) { }

    system_error(error_code __ec, const string& __what)
    : runtime_error(__what), _M_code(__ec) { }
    
    /*
     * TODO: Add const char* ctors to all exceptions.
     *
     * system_error(error_code __ec, const char* __what)
     * : runtime_error(__what), _M_code(__ec) { }
     *
     * system_error(int __v, const error_category& __ecat, const char* __what)
     * : runtime_error(__what), _M_code(error_code(__v, __ecat)) { }
     */

    system_error(int __v, const error_category& __ecat)
    : runtime_error(""), _M_code(error_code(__v, __ecat)) { }

    system_error(int __v, const error_category& __ecat, const string& __what)
    : runtime_error(__what), _M_code(error_code(__v, __ecat)) { }

    virtual ~system_error() throw();

    const error_code& 
    code() const throw() { return _M_code; }
  };

_GLIBCXX_END_NAMESPACE

#ifndef _GLIBCXX_COMPATIBILITY_CXX0X

#include <bits/functional_hash.h>

_GLIBCXX_BEGIN_NAMESPACE(std)

  // DR 1182.
  /// std::hash specialization for error_code.
  template<>
    struct hash<error_code>
    : public std::unary_function<error_code, size_t>
    {
      size_t
      operator()(const error_code& __e) const
      {
	const size_t __tmp = std::_Fnv_hash::hash(__e._M_value);
	return std::_Fnv_hash::__hash_combine(__e._M_cat, __tmp);
      }
    };

_GLIBCXX_END_NAMESPACE

#endif // _GLIBCXX_COMPATIBILITY_CXX0X

#endif // __GXX_EXPERIMENTAL_CXX0X__

#endif // _GLIBCXX_SYSTEM_ERROR

