#if !defined(CODEQL_ITERATOR_H) #define CODEQL_ITERATOR_H typedef unsigned long size_t; #include "type_traits.h" namespace std { struct ptrdiff_t; template struct iterator_traits; template struct iterator { typedef Category iterator_category; iterator(); iterator(iterator > const &other); // non-const -> const conversion constructor iterator &operator++(); iterator operator++(int); iterator &operator--(); iterator operator--(int); bool operator==(iterator other) const; bool operator!=(iterator other) const; reference_type operator*() const; pointer_type operator->() const; iterator operator+(int); iterator operator-(int); iterator &operator+=(int); iterator &operator-=(int); int operator-(iterator); reference_type operator[](int); }; struct input_iterator_tag {}; struct forward_iterator_tag : public input_iterator_tag {}; struct bidirectional_iterator_tag : public forward_iterator_tag {}; struct random_access_iterator_tag : public bidirectional_iterator_tag {}; struct output_iterator_tag {}; template class back_insert_iterator { protected: Container* container = nullptr; public: using iterator_category = output_iterator_tag; using value_type = void; using difference_type = ptrdiff_t; using pointer = void; using reference = void; using container_type = Container; constexpr back_insert_iterator() noexcept = default; constexpr explicit back_insert_iterator(Container& x); back_insert_iterator& operator=(const typename Container::value_type& value); back_insert_iterator& operator=(typename Container::value_type&& value); back_insert_iterator& operator*(); back_insert_iterator& operator++(); back_insert_iterator operator++(int); }; template constexpr back_insert_iterator back_inserter(Container& x) { // $ ir-def=*x return back_insert_iterator(x); } template class front_insert_iterator { protected: Container* container = nullptr; public: using iterator_category = output_iterator_tag; using value_type = void; using difference_type = ptrdiff_t; using pointer = void; using reference = void; using container_type = Container; constexpr front_insert_iterator() noexcept = default; constexpr explicit front_insert_iterator(Container& x); constexpr front_insert_iterator& operator=(const typename Container::value_type& value); constexpr front_insert_iterator& operator=(typename Container::value_type&& value); constexpr front_insert_iterator& operator*(); constexpr front_insert_iterator& operator++(); constexpr front_insert_iterator operator++(int); }; template constexpr front_insert_iterator front_inserter(Container& x) { // $ ir-def=*x return front_insert_iterator(x); } } #endif