libcxx initial import

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@103490 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/typeindex b/include/typeindex
new file mode 100644
index 0000000..6ce2d7b
--- /dev/null
+++ b/include/typeindex
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+//===-------------------------- typeindex ---------------------------------===//
+//
+// ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_TYPEINDEX
+#define _LIBCPP_TYPEINDEX
+
+/*
+
+    typeindex synopsis
+
+namespace std
+{
+
+class type_index
+{
+public:
+    type_index(const type_info& rhs);
+
+    bool operator==(const type_index& rhs) const;
+    bool operator!=(const type_index& rhs) const;
+    bool operator< (const type_index& rhs) const;
+    bool operator<=(const type_index& rhs) const;
+    bool operator> (const type_index& rhs) const;
+    bool operator>=(const type_index& rhs) const;
+
+    size_t hash_code() const;
+    const char* name() const;
+};
+
+template <>
+struct hash<type_index>
+    : public unary_function<type_index, size_t>
+{
+    size_t operator()(type_index index) const;
+};
+
+}  // std
+
+*/
+
+#include <__config>
+#include <typeinfo>
+#include <__functional_base>
+
+#pragma GCC system_header
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+class type_index
+{
+    const type_info* __t_;
+public:
+    type_index(const type_info& __y) : __t_(&__y) {}
+
+    bool operator==(const type_index& __y) const {return *__t_ == *__y.__t_;}
+    bool operator!=(const type_index& __y) const {return *__t_ != *__y.__t_;}
+    bool operator< (const type_index& __y) const {return  __t_->before(*__y.__t_);}
+    bool operator<=(const type_index& __y) const {return !__y.__t_->before(*__t_);}
+    bool operator> (const type_index& __y) const {return  __y.__t_->before(*__t_);}
+    bool operator>=(const type_index& __y) const {return !__t_->before(*__y.__t_);}
+
+    size_t hash_code() const {return __t_->hash_code();}
+    const char* name() const {return __t_->name();}
+};
+
+template <class _Tp> struct hash;
+
+template <>
+struct hash<type_index>
+    : public unary_function<type_index, size_t>
+{
+    size_t operator()(type_index __index) const {return __index.hash_code();}
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif  // _LIBCPP_TYPEINDEX