// -*- C++ -*-
/***************************************************************************
 *
 * <map> - definition of the C++ Standard Library map class template
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 *
 ***************************************************************************
 *
 * Copyright (c) 1994
 * Hewlett-Packard Company
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Hewlett-Packard Company makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 **************************************************************************/

#ifndef _RWSTD_MAP_INCLUDED
#define _RWSTD_MAP_INCLUDED


#include <rw/_allocator.h>   // for allocator
#include <rw/_funcbase.h>    // for less
#include <rw/_tree.h>        // for __rb_tree
#include <rw/_defs.h>


_RWSTD_NAMESPACE (__rw) { 


// This is used in the implementation of map and multimap.
template <class _TypeT, class _TypeU>
struct __select1st : public _STD::unary_function<_TypeT, _TypeU>
{
    const _TypeU& operator () (const _TypeT& __x) const {
        return __x.first;
    }
};


}   // namespace __rw


_RWSTD_NAMESPACE (std) { 

template <class _Key, class _TypeT,
          class _Compare = less<_Key>,
          class _Allocator = allocator<pair<const _Key, _TypeT> > >
class map
{
public:

    typedef _Key                                key_type;
    typedef _TypeT                              mapped_type;
    typedef pair<const key_type, mapped_type>   value_type;
    typedef _Compare                            key_compare;
    typedef _Allocator                          allocator_type;
    
private:
    
    typedef _RW::__rb_tree<key_type, value_type,
                           _RW::__select1st<value_type, key_type>, 
                           key_compare, allocator_type> _C_repT;
    _C_repT _C_rep;

public:

    typedef typename _C_repT::reference              reference;
    typedef typename _C_repT::const_reference        const_reference;
    typedef typename _C_repT::iterator               iterator;
    typedef typename _C_repT::const_iterator         const_iterator;
    typedef typename _C_repT::size_type              size_type;
    typedef typename _C_repT::difference_type        difference_type;
    typedef typename _C_repT::pointer                pointer;
    typedef typename _C_repT::const_pointer          const_pointer;
    typedef typename _C_repT::reverse_iterator       reverse_iterator;
    typedef typename _C_repT::const_reverse_iterator const_reverse_iterator;

    struct value_compare: binary_function<value_type, value_type, bool> {
        // explicitly specified template arg-list below
        // to work around an MSVC 6.0 bug (PR #26908)
        friend class map<_Key, _TypeT, _Compare, _Allocator>;

        bool operator () (const value_type &__x, const value_type &__y) const {
            return comp (__x.first, __y.first);
        }

    protected:

        key_compare comp;

        value_compare (key_compare __cmp) : comp (__cmp) { /* empty */ }
    };

    // 23.3.1.1, p1
    explicit
    map (const key_compare &__cmp   = key_compare (),
         const allocator_type &__alloc = allocator_type ()) 
        : _C_rep (__cmp, __alloc) { }

    // 23.3.1.1, p3
    template <class _InputIter>
    map (_InputIter __first, _InputIter __last, 
         const _Compare& __cmp = _Compare (),
         const _Allocator& __alloc = _Allocator ())
      : _C_rep (__first, __last, __cmp, __alloc, false) { }

    map (const map &__rhs): _C_rep (__rhs._C_rep) { /* empty */ }

    map& operator= (const map &__rhs) {
        _C_rep = __rhs._C_rep; return *this; 
    }

    allocator_type get_allocator () const {
        return _C_rep.get_allocator ();
    }

    iterator begin () {
        return _C_rep.begin ();
    }

    const_iterator begin () const {
        return _C_rep.begin ();
    }

    iterator end () {
        return _C_rep.end ();
    }

    const_iterator end () const {
        return _C_rep.end ();
    }

    reverse_iterator rbegin () {
        return _C_rep.rbegin ();
    }

    const_reverse_iterator rbegin () const {
        return _C_rep.rbegin ();
    }

    reverse_iterator rend () {
        return _C_rep.rend ();
    }

    const_reverse_iterator rend () const {
        return _C_rep.rend ();
    }

    bool empty () const {
        return _C_rep.empty ();
    }

    size_type size () const {
        return _C_rep.size ();
    }

    size_type max_size () const {
        return _C_rep.max_size ();
    }

    mapped_type& operator[] (const key_type &__k) {
        // note: temporary is necessary to avoid an xlC 5.0 bug (PR #25040)
        iterator __i = insert (value_type (__k, mapped_type ())).first;
        return (*__i).second;
    }

    pair<iterator, bool> insert (const value_type &__x) {
        return _C_rep.insert (__x, false);
    }

    iterator insert (iterator __it, const value_type &__x) {
        return _C_rep.insert (__it, __x, false);
    }

    template<class _InputIter>
    void insert (_InputIter __first, _InputIter __last) {
        _C_rep.insert (__first, __last, false);
    }

    void erase (iterator __it) {
        _C_rep.erase (__it);
    }

    size_type erase (const key_type& __x) {
        return _C_rep.erase (__x);
    }

    void  erase (iterator __first, iterator __last) {
        _C_rep.erase (__first,__last);
    }
    void swap (map &__x) {
        _C_rep.swap (__x._C_rep);
    }

    void clear () {
        erase (begin (),end ());
    }

    key_compare key_comp () const {
        return _C_rep.key_comp ();
    }

    value_compare value_comp () const {
        return value_compare (_C_rep.key_comp ());
    }

    iterator find (const key_type& __x) {
        return _C_rep.find (__x);
    }

    const_iterator find (const key_type& __x) const {
        return _C_rep.find (__x);
    }

    size_type count (const key_type& __x) const {
        return _C_rep.count (__x);
    }

    iterator lower_bound (const key_type& __x) {
        return _C_rep.lower_bound (__x);
    }

    iterator upper_bound (const key_type& __x) {
        return _C_rep.upper_bound (__x);
    }

    const_iterator lower_bound (const key_type& __x) const {
        return _C_rep.lower_bound (__x); 
    }

    const_iterator upper_bound (const key_type& __x) const {
        return _C_rep.upper_bound (__x); 
    }

    pair<iterator, iterator> equal_range (const key_type& __x) {
        return _C_rep.equal_range (__x);
    }

    pair<const_iterator, const_iterator>
    equal_range (const key_type& __x) const {
        return _C_rep.equal_range (__x);
    }

#if defined (_RWSTD_NO_PART_SPEC_OVERLOAD)
    friend void swap (map& __lhs, map& __rhs) {
        __lhs.swap (__rhs);
    }
#endif

};


template <class _Key, class _TypeT,
          class _Compare = less<_Key>,
          class _Allocator = allocator<pair<const _Key, _TypeT> > >
class multimap
{
public:

    typedef _Key                                key_type;
    typedef _TypeT                              mapped_type;
    typedef pair<const key_type, mapped_type>   value_type;
    typedef _Compare                            key_compare;
    typedef _Allocator                          allocator_type;

private:
    
    typedef _RW::__rb_tree<key_type, value_type, 
                           _RW::__select1st<value_type, key_type>, 
                           key_compare, allocator_type> _C_repT;
    _C_repT _C_rep;

public:

    typedef typename _C_repT::reference              reference;
    typedef typename _C_repT::const_reference        const_reference;
    typedef typename _C_repT::iterator               iterator;
    typedef typename _C_repT::const_iterator         const_iterator; 
    typedef typename _C_repT::size_type              size_type;
    typedef typename _C_repT::difference_type        difference_type;
    typedef typename _C_repT::pointer                pointer;
    typedef typename _C_repT::const_pointer          const_pointer; 
    typedef typename _C_repT::reverse_iterator       reverse_iterator;
    typedef typename _C_repT::const_reverse_iterator const_reverse_iterator;

    struct value_compare: binary_function<value_type, value_type, bool> {
        // explicitly specified template arg-list below
        // to work around an MSVC 6.0 bug (PR #26908)
        friend class multimap<_Key, _TypeT, _Compare, _Allocator>;

        bool operator () (const value_type &__x, const value_type &__y) const {
            return comp (__x.first, __y.first);
        }

    protected:

        key_compare comp;
        value_compare (key_compare __cmp): comp (__cmp) { /* empty */ }
    };

    explicit
    multimap (const key_compare &__cmp = key_compare (),
              const allocator_type &__alloc = allocator_type ())
      : _C_rep (__cmp, __alloc) { }

    template<class _InputIter>
    multimap (_InputIter __first, _InputIter __last, 
              const _Compare& __cmp = _Compare (),
              const _Allocator& __alloc = _Allocator ()) 
      : _C_rep (__first, __last, __cmp, __alloc, true) { }

    multimap (const multimap &__rhs)
        : _C_rep (__rhs._C_rep) { }

    multimap& operator= (const multimap &__rhs) {
        _C_rep = __rhs._C_rep; return *this; 
    }

    allocator_type get_allocator () const {
        return _C_rep.get_allocator ();
    }

    iterator begin () {
        return _C_rep.begin ();
    }

    const_iterator begin () const {
        return _C_rep.begin ();
    }

    iterator end () {
        return _C_rep.end ();
    }

    const_iterator end () const {
        return _C_rep.end ();
    }

    reverse_iterator rbegin () {
        return _C_rep.rbegin ();
    }

    const_reverse_iterator rbegin () const {
        return _C_rep.rbegin ();
    }

    reverse_iterator rend () {
        return _C_rep.rend ();
    }

    const_reverse_iterator rend () const {
        return _C_rep.rend ();
    }

    bool empty () const {
        return _C_rep.empty ();
    }

    size_type size () const {
        return _C_rep.size ();
    }

    size_type max_size () const {
        return _C_rep.max_size ();
    }

    iterator insert (const value_type& __x) {
        return _C_rep.insert (__x, true).first;
    }

    iterator insert (iterator __it, const value_type& __x) {
        return _C_rep.insert (__it, __x, true);
    }

    template<class _InputIter>
    void insert (_InputIter __first, _InputIter __last) {
        _C_rep.insert (__first, __last, true);
    }

    void erase (iterator __it) {
        _C_rep.erase (__it);
    }

    size_type erase (const key_type& __x) {
        return _C_rep.erase (__x);
    }

    void erase (iterator __first, iterator __last) {
        _C_rep.erase (__first, __last);
    }

    void clear () {
        erase (begin (),end ());
    }

    void swap (multimap &__x) {
        _C_rep.swap (__x._C_rep);
    }

    key_compare  key_comp () const {
        return _C_rep.key_comp ();
    }

    value_compare value_comp () const {
        return value_compare (_C_rep.key_comp ());
    }

    iterator find (const key_type& __x) {
        return _C_rep.find (__x);
    }

    const_iterator find (const key_type& __x) const {
        return _C_rep.find (__x);
    }

    size_type count (const key_type& __x) const {
        return _C_rep.count (__x);
    }

    iterator lower_bound (const key_type& __x) {
        return _C_rep.lower_bound (__x);
    }

    iterator upper_bound (const key_type& __x) {
        return _C_rep.upper_bound (__x);
    }

    const_iterator lower_bound (const key_type& __x) const {
        return _C_rep.lower_bound (__x); 
    }

    const_iterator upper_bound (const key_type& __x) const {
        return _C_rep.upper_bound (__x); 
    }

    pair<iterator, iterator>
    equal_range (const key_type& __x) {
        return _C_rep.equal_range (__x);
    }

    pair<const_iterator, const_iterator>
    equal_range (const key_type& __x) const {
        return _C_rep.equal_range (__x);
    }

#if defined (_RWSTD_NO_PART_SPEC_OVERLOAD)
    friend void swap (multimap& __lhs, multimap& __rhs) {
        __lhs.swap (__rhs);
    }
#endif

};


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator== (const map<_Key, _TypeT, _Compare, _Allocator> &__x,
                        const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return    __x.size () == __y.size ()
           && equal (__x.begin (), __x.end (), __y.begin ());
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator< (const map<_Key, _TypeT, _Compare, _Allocator> &__x, 
                       const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return lexicographical_compare (__x.begin (), __x.end (),
                                    __y.begin (), __y.end ());
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator!= (const map<_Key, _TypeT, _Compare, _Allocator> &__x, 
                        const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__x == __y);
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator> (const map<_Key, _TypeT, _Compare, _Allocator> &__x, 
                       const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return __y < __x;
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator>= (const map<_Key, _TypeT, _Compare, _Allocator> &__x, 
                        const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__x < __y);
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool operator<= (const map<_Key, _TypeT, _Compare, _Allocator> &__x, 
                        const map<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__y <  __x);
}


#ifndef _RWSTD_NO_PART_SPEC_OVERLOAD

// 23.3.1.4
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline void swap (map<_Key, _TypeT, _Compare, _Allocator> &__y, 
                  map<_Key, _TypeT, _Compare, _Allocator> &__x)
{
    __x.swap (__y);
}

#endif   // _RWSTD_NO_PART_SPEC_OVERLOAD


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator== (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
            const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return    __x.size () == __y.size ()
           && equal (__x.begin (), __x.end (), __y.begin ());
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator< (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
           const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return lexicographical_compare (__x.begin (), __x.end (),
                                    __y.begin (), __y.end ());
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator!= (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
            const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__x == __y);
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator> (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
           const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return __y < __x;
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator>= (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
            const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__x < __y);
}


// 23.1, p5 - table 65
template <class _Key, class _TypeT, class _Compare, class _Allocator>
inline bool
operator<= (const multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
            const multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    return !(__y <  __x);
}


#ifndef _RWSTD_NO_PART_SPEC_OVERLOAD

// 23.3.2.3
template <class _Key, class _TypeT, class _Compare, class _Allocator>
void swap (multimap<_Key, _TypeT, _Compare, _Allocator> &__x, 
           multimap<_Key, _TypeT, _Compare, _Allocator> &__y)
{
    __x.swap (__y);
}

#endif   // _RWSTD_NO_PART_SPEC_OVERLOAD


}   // namespace std


#endif   // _RWSTD_MAP_INCLUDED
