Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===-------------------------- typeindex ---------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_TYPEINDEX
     12 #define _LIBCPP_TYPEINDEX
     13 
     14 /*
     15 
     16     typeindex synopsis
     17 
     18 namespace std
     19 {
     20 
     21 class type_index
     22 {
     23 public:
     24     type_index(const type_info& rhs) noexcept;
     25 
     26     bool operator==(const type_index& rhs) const noexcept;
     27     bool operator!=(const type_index& rhs) const noexcept;
     28     bool operator< (const type_index& rhs) const noexcept;
     29     bool operator<=(const type_index& rhs) const noexcept;
     30     bool operator> (const type_index& rhs) const noexcept;
     31     bool operator>=(const type_index& rhs) const noexcept;
     32 
     33     size_t hash_code() const noexcept;
     34     const char* name() const noexcept;
     35 };
     36 
     37 template <>
     38 struct hash<type_index>
     39     : public unary_function<type_index, size_t>
     40 {
     41     size_t operator()(type_index index) const noexcept;
     42 };
     43 
     44 }  // std
     45 
     46 */
     47 
     48 #include <__config>
     49 #include <typeinfo>
     50 #include <__functional_base>
     51 
     52 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
     53 #pragma GCC system_header
     54 #endif
     55 
     56 _LIBCPP_BEGIN_NAMESPACE_STD
     57 
     58 class _LIBCPP_TYPE_VIS_ONLY type_index
     59 {
     60     const type_info* __t_;
     61 public:
     62     _LIBCPP_INLINE_VISIBILITY
     63     type_index(const type_info& __y) _NOEXCEPT : __t_(&__y) {}
     64 
     65     _LIBCPP_INLINE_VISIBILITY
     66     bool operator==(const type_index& __y) const _NOEXCEPT
     67         {return *__t_ == *__y.__t_;}
     68     _LIBCPP_INLINE_VISIBILITY
     69     bool operator!=(const type_index& __y) const _NOEXCEPT
     70         {return *__t_ != *__y.__t_;}
     71     _LIBCPP_INLINE_VISIBILITY
     72     bool operator< (const type_index& __y) const _NOEXCEPT
     73         {return  __t_->before(*__y.__t_);}
     74     _LIBCPP_INLINE_VISIBILITY
     75     bool operator<=(const type_index& __y) const _NOEXCEPT
     76         {return !__y.__t_->before(*__t_);}
     77     _LIBCPP_INLINE_VISIBILITY
     78     bool operator> (const type_index& __y) const _NOEXCEPT
     79         {return  __y.__t_->before(*__t_);}
     80     _LIBCPP_INLINE_VISIBILITY
     81     bool operator>=(const type_index& __y) const _NOEXCEPT
     82         {return !__t_->before(*__y.__t_);}
     83 
     84     _LIBCPP_INLINE_VISIBILITY
     85     size_t hash_code() const _NOEXCEPT {return __t_->hash_code();}
     86     _LIBCPP_INLINE_VISIBILITY
     87     const char* name() const _NOEXCEPT {return __t_->name();}
     88 };
     89 
     90 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
     91 
     92 template <>
     93 struct _LIBCPP_TYPE_VIS_ONLY hash<type_index>
     94     : public unary_function<type_index, size_t>
     95 {
     96     _LIBCPP_INLINE_VISIBILITY
     97     size_t operator()(type_index __index) const _NOEXCEPT
     98         {return __index.hash_code();}
     99 };
    100 
    101 _LIBCPP_END_NAMESPACE_STD
    102 
    103 #endif  // _LIBCPP_TYPEINDEX
    104