// Debugging string implementation -*- C++ -*-

// Copyright (C) 2003, 2005, 2006
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

/** @file debug/string
 *  This file is a GNU debug extension to the Standard C++ Library.
 */

#ifndef _GLIBCXX_DEBUG_STRING
#define _GLIBCXX_DEBUG_STRING 1

#include <string>
#include <debug/safe_sequence.h>
#include <debug/safe_iterator.h>

namespace __gnu_debug
{
  template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
            typename _Allocator = std::allocator<_CharT> >
    class basic_string
    : public std::basic_string<_CharT, _Traits, _Allocator>,
      public __gnu_debug::_Safe_sequence<basic_string<_CharT, _Traits,
						      _Allocator> >
    {
      typedef std::basic_string<_CharT, _Traits, _Allocator> _Base;
      typedef __gnu_debug::_Safe_sequence<basic_string>     _Safe_base;

  public:
    // types:
    typedef _Traits				       traits_type;
    typedef typename _Traits::char_type		       value_type;
    typedef _Allocator				       allocator_type;
    typedef typename _Base::size_type                  size_type;
    typedef typename _Base::difference_type            difference_type;
    typedef typename _Base::reference                  reference;
    typedef typename _Base::const_reference            const_reference;
    typedef typename _Base::pointer                    pointer;
    typedef typename _Base::const_pointer              const_pointer;

    typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, basic_string>
                                                       iterator;
    typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
                                         basic_string> const_iterator;

    typedef std::reverse_iterator<iterator>            reverse_iterator;
    typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;

    using _Base::npos;

    // 21.3.1 construct/copy/destroy:
    explicit basic_string(const _Allocator& __a = _Allocator())
    : _Base(__a)
    { }

    // Provides conversion from a release-mode string to a debug-mode string
    basic_string(const _Base& __base) : _Base(__base), _Safe_base() { }

    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    // 42. string ctors specify wrong default allocator
    basic_string(const basic_string& __str)
    : _Base(__str, 0, _Base::npos, __str.get_allocator()), _Safe_base()
    { }

    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    // 42. string ctors specify wrong default allocator
    basic_string(const basic_string& __str, size_type __pos,
		   size_type __n = _Base::npos,
		   const _Allocator& __a = _Allocator())
    : _Base(__str, __pos, __n, __a)
    { }

    basic_string(const _CharT* __s, size_type __n,
		   const _Allocator& __a = _Allocator())
    : _Base(__gnu_debug::__check_string(__s, __n), __n, __a)
    { }

    basic_string(const _CharT* __s, const _Allocator& __a = _Allocator())
    : _Base(__gnu_debug::__check_string(__s), __a)
    { this->assign(__s); }

    basic_string(size_type __n, _CharT __c,
		   const _Allocator& __a = _Allocator())
    : _Base(__n, __c, __a)
    { }

    template<typename _InputIterator>
      basic_string(_InputIterator __begin, _InputIterator __end,
		     const _Allocator& __a = _Allocator())
      : _Base(__gnu_debug::__check_valid_range(__begin, __end), __end, __a)
      { }

    ~basic_string() { }

    basic_string&
    operator=(const basic_string& __str)
    {
      *static_cast<_Base*>(this) = __str;
      this->_M_invalidate_all();
      return *this;
    }

    basic_string&
    operator=(const _CharT* __s)
    {
      __glibcxx_check_string(__s);
      *static_cast<_Base*>(this) = __s;
      this->_M_invalidate_all();
      return *this;
    }

    basic_string&
    operator=(_CharT __c)
    {
      *static_cast<_Base*>(this) = __c;
      this->_M_invalidate_all();
      return *this;
    }

    // 21.3.2 iterators:
    iterator
    begin()
    { return iterator(_Base::begin(), this); }

    const_iterator
    begin() const
    { return const_iterator(_Base::begin(), this); }

    iterator
    end()
    { return iterator(_Base::end(), this); }

    const_iterator
    end() const
    { return const_iterator(_Base::end(), this); }

    reverse_iterator
    rbegin()
    { return reverse_iterator(end()); }

    const_reverse_iterator
    rbegin() const
    { return const_reverse_iterator(end()); }

    reverse_iterator
    rend()
    { return reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(begin()); }

    n() const
    { return constrn reverse_iterator(beg