#ifndef MAP_HPP # define MAP_HPP # include // std::allocator # include // NULL, std::size_t, std::ptrdiff_t # include // max() # include // std::less, std::binary_function # include "reverse_iterator.hpp" # include "equal.hpp" # include "lexicographical_compare.hpp" # include "pair.hpp" # include "map_node.hpp" # include "map_iterator.hpp" namespace ft { template < class Key, // map::key_type class T, // map::mapped_type class Compare = std::less, // map::key_compare class Alloc = std::allocator< ft::pair > // map::allocator_type > class map { public: typedef Key key_type; typedef T mapped_type; typedef pair value_type; typedef Compare key_compare; typedef Alloc allocator_type; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; // typedef typename Alloc::pointer pointer; // typedef typename Alloc::const_pointer const_pointer; // typedef typename Alloc::reference reference; // typedef typename Alloc::const_reference const_reference; typedef map_iterator iterator; typedef map_const_iterator const_iterator; typedef ft::reverse_iterator reverse_iterator; typedef ft::reverse_iterator const_reverse_iterator; class value_compare : public std::binary_function { friend class map; protected: Compare comp; value_compare(Compare c) : comp(c) {} public: bool operator() (const value_type& x, const value_type& y) const { return comp(x.first, y.first); } }; // Member functions explicit map(const Compare& comp = Compare(), const Alloc& alloc = Alloc() ); template < typename InputIt > map(InputIt first, InputIt last, const Compare& comp = Compare(), const Alloc& alloc = Alloc()); map(const map& src); ~map(); map& operator=(const map& rhs); // Element access T& operator[](const Key& key); // Iterators iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; // Capacity bool empty() const; size_type size() const; size_type max_size() const; // Modifiers void clear(); pair insert(const value_type& value); iterator insert(iterator hint, const value_type& value); template < typename InputIt > void insert(InputIt first, InputIt last); void erase(iterator pos); void erase(iterator first, iterator last); size_type erase(const Key& key); void swap(map& other); // Lookup iterator find(const Key& key); const_iterator find(const Key& key) const; size_type count(const Key& key) const; private: size_type _size; node* _root; node_sentinel* _sentinel; Compare _comp; Alloc _allocator; // TODO : rebind syntaxe pas clair. typename Alloc::template rebind< node >::other _allocator_node; // Peu clair, verifier syntaxe typename Alloc::template rebind< node_sentinel >::other _allocator_node_sentinel; // Peu clair, verifier syntaxe void _init_sentinel(); pair _insert(const value_type& value); node* _erase(iterator pos); node* _subtree_shift(node* st_old, node* st_new); // AVL Balancing void _insert_rebalancing(node* n); void _erase_rebalancing(node* n); short _compute_height(node* n); short _bf(node* n); // balance factor node* _rotate_left(node* n); node* _rotate_right(node* n); }; // Non-member functions template < typename Key, typename T, typename Compare, typename Alloc > bool operator==(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator!=(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator<(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator>(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator<=(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > bool operator>=(const map& lhs, const map& rhs); template < typename Key, typename T, typename Compare, typename Alloc > void swap(map& lhs, map& rhs); } // namespace ft # include "bst.tpp" // https://en.wikipedia.org/wiki/Binary_search_tree // https://en.wikipedia.org/wiki/AVL_tree // https://fr.wikipedia.org/wiki/Arbre_binaire_de_recherche // https://fr.wikipedia.org/wiki/Arbre_AVL // https://visualgo.net/en/bst // https://visualgo.net/en/bst?slide=14-8 // --> to 14-13 #endif