1c22bb6f5SUtkarsh Saxena 2c22bb6f5SUtkarsh Saxena namespace __gnu_cxx { 3c22bb6f5SUtkarsh Saxena template <typename T> 4c22bb6f5SUtkarsh Saxena struct basic_iterator { 5c22bb6f5SUtkarsh Saxena basic_iterator operator++(); 6c22bb6f5SUtkarsh Saxena T& operator*() const; 7c22bb6f5SUtkarsh Saxena T* operator->() const; 8c22bb6f5SUtkarsh Saxena }; 9c22bb6f5SUtkarsh Saxena 10c22bb6f5SUtkarsh Saxena template<typename T> 11c22bb6f5SUtkarsh Saxena bool operator!=(basic_iterator<T>, basic_iterator<T>); 12c22bb6f5SUtkarsh Saxena } 13c22bb6f5SUtkarsh Saxena 14c22bb6f5SUtkarsh Saxena namespace std { 15c22bb6f5SUtkarsh Saxena template<typename T> struct remove_reference { typedef T type; }; 16c22bb6f5SUtkarsh Saxena template<typename T> struct remove_reference<T &> { typedef T type; }; 17c22bb6f5SUtkarsh Saxena template<typename T> struct remove_reference<T &&> { typedef T type; }; 18c22bb6f5SUtkarsh Saxena 19c22bb6f5SUtkarsh Saxena template<typename T> 20c22bb6f5SUtkarsh Saxena typename remove_reference<T>::type &&move(T &&t) noexcept; 21c22bb6f5SUtkarsh Saxena 22c22bb6f5SUtkarsh Saxena template <typename C> 23c22bb6f5SUtkarsh Saxena auto data(const C &c) -> decltype(c.data()); 24c22bb6f5SUtkarsh Saxena 25c22bb6f5SUtkarsh Saxena template <typename C> 26c22bb6f5SUtkarsh Saxena auto begin(C &c) -> decltype(c.begin()); 27c22bb6f5SUtkarsh Saxena 28c22bb6f5SUtkarsh Saxena template<typename T, int N> 29c22bb6f5SUtkarsh Saxena T *begin(T (&array)[N]); 30c22bb6f5SUtkarsh Saxena 31c22bb6f5SUtkarsh Saxena using size_t = decltype(sizeof(0)); 32c22bb6f5SUtkarsh Saxena 33c22bb6f5SUtkarsh Saxena template<typename T> 34c22bb6f5SUtkarsh Saxena struct initializer_list { 35c22bb6f5SUtkarsh Saxena const T* ptr; size_t sz; 36c22bb6f5SUtkarsh Saxena }; 37c22bb6f5SUtkarsh Saxena template<typename T> class allocator {}; 38c22bb6f5SUtkarsh Saxena template <typename T, typename Alloc = allocator<T>> 39c22bb6f5SUtkarsh Saxena struct vector { 40c22bb6f5SUtkarsh Saxena typedef __gnu_cxx::basic_iterator<T> iterator; 41c22bb6f5SUtkarsh Saxena iterator begin(); 42c22bb6f5SUtkarsh Saxena iterator end(); 43c22bb6f5SUtkarsh Saxena const T *data() const; 44c22bb6f5SUtkarsh Saxena vector(); 45c22bb6f5SUtkarsh Saxena vector(initializer_list<T> __l, 46c22bb6f5SUtkarsh Saxena const Alloc& alloc = Alloc()); 47c22bb6f5SUtkarsh Saxena 48c22bb6f5SUtkarsh Saxena template<typename InputIterator> 49c22bb6f5SUtkarsh Saxena vector(InputIterator first, InputIterator __last); 50c22bb6f5SUtkarsh Saxena 51c22bb6f5SUtkarsh Saxena T &at(int n); 52912c502aSUtkarsh Saxena 53912c502aSUtkarsh Saxena void push_back(const T&); 54912c502aSUtkarsh Saxena void push_back(T&&); 55*bd56950bSHaojian Wu const T& back() const; 56912c502aSUtkarsh Saxena void insert(iterator, T&&); 57c22bb6f5SUtkarsh Saxena }; 58c22bb6f5SUtkarsh Saxena 59c22bb6f5SUtkarsh Saxena template<typename T> 60c22bb6f5SUtkarsh Saxena struct basic_string_view { 61c22bb6f5SUtkarsh Saxena basic_string_view(); 62c22bb6f5SUtkarsh Saxena basic_string_view(const T *); 63c22bb6f5SUtkarsh Saxena const T *begin() const; 64c22bb6f5SUtkarsh Saxena }; 65c22bb6f5SUtkarsh Saxena using string_view = basic_string_view<char>; 66c22bb6f5SUtkarsh Saxena 67c22bb6f5SUtkarsh Saxena template<class _Mystr> struct iter { 68c22bb6f5SUtkarsh Saxena iter& operator-=(int); 69c22bb6f5SUtkarsh Saxena 70c22bb6f5SUtkarsh Saxena iter operator-(int _Off) const { 71c22bb6f5SUtkarsh Saxena iter _Tmp = *this; 72c22bb6f5SUtkarsh Saxena return _Tmp -= _Off; 73c22bb6f5SUtkarsh Saxena } 74c22bb6f5SUtkarsh Saxena }; 75c22bb6f5SUtkarsh Saxena 76c22bb6f5SUtkarsh Saxena template<typename T> 77c22bb6f5SUtkarsh Saxena struct basic_string { 78c22bb6f5SUtkarsh Saxena basic_string(); 79c22bb6f5SUtkarsh Saxena basic_string(const T *); 80c22bb6f5SUtkarsh Saxena const T *c_str() const; 81c22bb6f5SUtkarsh Saxena operator basic_string_view<T> () const; 82c22bb6f5SUtkarsh Saxena using const_iterator = iter<T>; 83c22bb6f5SUtkarsh Saxena }; 84c22bb6f5SUtkarsh Saxena using string = basic_string<char>; 85c22bb6f5SUtkarsh Saxena 86c22bb6f5SUtkarsh Saxena template<typename T> 87c22bb6f5SUtkarsh Saxena struct unique_ptr { 88c22bb6f5SUtkarsh Saxena T &operator*(); 89c22bb6f5SUtkarsh Saxena T *get() const; 90c22bb6f5SUtkarsh Saxena }; 91c22bb6f5SUtkarsh Saxena 92c22bb6f5SUtkarsh Saxena template<typename T> 93c22bb6f5SUtkarsh Saxena struct optional { 94c22bb6f5SUtkarsh Saxena optional(); 95c22bb6f5SUtkarsh Saxena optional(const T&); 96c22bb6f5SUtkarsh Saxena 97c22bb6f5SUtkarsh Saxena template<typename U = T> 98c22bb6f5SUtkarsh Saxena optional(U&& t); 99c22bb6f5SUtkarsh Saxena 100c22bb6f5SUtkarsh Saxena template<typename U> 101c22bb6f5SUtkarsh Saxena optional(optional<U>&& __t); 102c22bb6f5SUtkarsh Saxena 103c22bb6f5SUtkarsh Saxena T &operator*() &; 104c22bb6f5SUtkarsh Saxena T &&operator*() &&; 105c22bb6f5SUtkarsh Saxena T &value() &; 106c22bb6f5SUtkarsh Saxena T &&value() &&; 107c22bb6f5SUtkarsh Saxena }; 108c22bb6f5SUtkarsh Saxena template<typename T> 109c22bb6f5SUtkarsh Saxena optional<__decay(T)> make_optional(T&&); 110c22bb6f5SUtkarsh Saxena 111c22bb6f5SUtkarsh Saxena 112c22bb6f5SUtkarsh Saxena template<typename T> 113c22bb6f5SUtkarsh Saxena struct stack { 114c22bb6f5SUtkarsh Saxena T &top(); 115c22bb6f5SUtkarsh Saxena }; 116c22bb6f5SUtkarsh Saxena 117c22bb6f5SUtkarsh Saxena struct any {}; 118c22bb6f5SUtkarsh Saxena 119c22bb6f5SUtkarsh Saxena template<typename T> 120c22bb6f5SUtkarsh Saxena T any_cast(const any& operand); 121c22bb6f5SUtkarsh Saxena 122c22bb6f5SUtkarsh Saxena template<typename T> 123c22bb6f5SUtkarsh Saxena struct reference_wrapper { 124c22bb6f5SUtkarsh Saxena template<typename U> 125c22bb6f5SUtkarsh Saxena reference_wrapper(U &&); 126c22bb6f5SUtkarsh Saxena }; 127c22bb6f5SUtkarsh Saxena 128c22bb6f5SUtkarsh Saxena template<typename T> 129c22bb6f5SUtkarsh Saxena reference_wrapper<T> ref(T& t) noexcept; 130c22bb6f5SUtkarsh Saxena 13133b910cdSHaojian Wu template <typename T> 13233b910cdSHaojian Wu struct [[gsl::Pointer]] iterator { 13333b910cdSHaojian Wu T& operator*() const; 13433b910cdSHaojian Wu }; 13533b910cdSHaojian Wu 136c22bb6f5SUtkarsh Saxena struct false_type { 137c22bb6f5SUtkarsh Saxena static constexpr bool value = false; 138c22bb6f5SUtkarsh Saxena constexpr operator bool() const noexcept { return value; } 139c22bb6f5SUtkarsh Saxena }; 140c22bb6f5SUtkarsh Saxena struct true_type { 141c22bb6f5SUtkarsh Saxena static constexpr bool value = true; 142c22bb6f5SUtkarsh Saxena constexpr operator bool() const noexcept { return value; } 143c22bb6f5SUtkarsh Saxena }; 144c22bb6f5SUtkarsh Saxena 145c22bb6f5SUtkarsh Saxena template<class T> struct is_pointer : false_type {}; 146c22bb6f5SUtkarsh Saxena template<class T> struct is_pointer<T*> : true_type {}; 147c22bb6f5SUtkarsh Saxena template<class T> struct is_pointer<T* const> : true_type {}; 148c22bb6f5SUtkarsh Saxena } 149