[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@3.147.45.16: ~ $
// Pair implementation -*- C++ -*-

// Copyright (C) 2001-2013 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 3, 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.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/*
 *
 * 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.
 *
 *
 * Copyright (c) 1996,1997
 * Silicon Graphics Computer Systems, Inc.
 *
 * 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.  Silicon Graphics makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 */

/** @file bits/stl_pair.h
 *  This is an internal header file, included by other library headers.
 *  Do not attempt to use it directly. @headername{utility}
 */

#ifndef _STL_PAIR_H
#define _STL_PAIR_H 1

#include <bits/move.h> // for std::move / std::forward, and std::swap

#if __cplusplus >= 201103L
#include <type_traits> // for std::__decay_and_strip too
#endif

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

  /**
   *  @addtogroup utilities
   *  @{
   */

#if __cplusplus >= 201103L
  /// piecewise_construct_t
  struct piecewise_construct_t { };

  /// piecewise_construct
  constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();

  // Forward declarations.
  template<typename...>
    class tuple;

  template<std::size_t...>
    struct _Index_tuple;
#endif

 /**
   *  @brief Struct holding two objects of arbitrary type.
   *
   *  @tparam _T1  Type of first object.
   *  @tparam _T2  Type of second object.
   */
  template<class _T1, class _T2>
    struct pair
    {
      typedef _T1 first_type;    /// @c first_type is the first bound type
      typedef _T2 second_type;   /// @c second_type is the second bound type

      _T1 first;                 /// @c first is a copy of the first object
      _T2 second;                /// @c second is a copy of the second object

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 265.  std::pair::pair() effects overly restrictive
      /** The default constructor creates @c first and @c second using their
       *  respective default constructors.  */
      _GLIBCXX_CONSTEXPR pair()
      : first(), second() { }

      /** Two objects may be passed to a @c pair constructor to be copied.  */
      _GLIBCXX_CONSTEXPR pair(const _T1& __a, const _T2& __b)
      : first(__a), second(__b) { }

      /** There is also a templated copy ctor for the @c pair class itself.  */
#if __cplusplus < 201103L
      template<class _U1, class _U2>
	pair(const pair<_U1, _U2>& __p)
	: first(__p.first), second(__p.second) { }
#else
      template<class _U1, class _U2, class = typename
	       enable_if<__and_<is_convertible<const _U1&, _T1>,
				is_convertible<const _U2&, _T2>>::value>::type>
	constexpr pair(const pair<_U1, _U2>& __p)
	: first(__p.first), second(__p.second) { }

      constexpr pair(const pair&) = default;
      constexpr pair(pair&&) = default;

      // DR 811.
      template<class _U1, class = typename
	       enable_if<is_convertible<_U1, _T1>::value>::type>
	constexpr pair(_U1&& __x, const _T2& __y)
	: first(std::forward<_U1>(__x)), second(__y) { }

      template<class _U2, class = typename
	       enable_if<is_convertible<_U2, _T2>::value>::type>
	constexpr pair(const _T1& __x, _U2&& __y)
	: first(__x), second(std::forward<_U2>(__y)) { }

      template<class _U1, class _U2, class = typename
	       enable_if<__and_<is_convertible<_U1, _T1>,
				is_convertible<_U2, _T2>>::value>::type>
	constexpr pair(_U1&& __x, _U2&& __y)
	: first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }

      template<class _U1, class _U2, class = typename
	       enable_if<__and_<is_convertible<_U1, _T1>,
				is_convertible<_U2, _T2>>::value>::type>
	constexpr pair(pair<_U1, _U2>&& __p)
	: first(std::forward<_U1>(__p.first)),
	  second(std::forward<_U2>(__p.second)) { }

      template<typename... _Args1, typename... _Args2>
        pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);

      pair&
      operator=(const pair& __p)
      {
	first = __p.first;
	second = __p.second;
	return *this;
      }

      pair&
      operator=(pair&& __p)
      noexcept(__and_<is_nothrow_move_assignable<_T1>,
	              is_nothrow_move_assignable<_T2>>::value)
      {
	first = std::forward<first_type>(__p.first);
	second = std::forward<second_type>(__p.second);
	return *this;
      }

      template<class _U1, class _U2>
	pair&
	operator=(const pair<_U1, _U2>& __p)
	{
	  first = __p.first;
	  second = __p.second;
	  return *this;
	}

      template<class _U1, class _U2>
	pair&
	operator=(pair<_U1, _U2>&& __p)
	{
	  first = std::forward<_U1>(__p.first);
	  second = std::forward<_U2>(__p.second);
	  return *this;
	}

      void
      swap(pair& __p)
      noexcept(noexcept(swap(first, __p.first))
	       && noexcept(swap(second, __p.second)))
      {
	using std::swap;
	swap(first, __p.first);
	swap(second, __p.second);
      }

    private:
      template<typename... _Args1, std::size_t... _Indexes1,
               typename... _Args2, std::size_t... _Indexes2>
        pair(tuple<_Args1...>&, tuple<_Args2...>&,
             _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>);
#endif
    };

  /// Two pairs of the same type are equal iff their members are equal.
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __x.first == __y.first && __x.second == __y.second; }

  /// <http://gcc.gnu.org/onlinedocs/libstdc++/manual/utilities.html>
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __x.first < __y.first
	     || (!(__y.first < __x.first) && __x.second < __y.second); }

  /// Uses @c operator== to find the result.
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__x == __y); }

  /// Uses @c operator< to find the result.
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return __y < __x; }

  /// Uses @c operator< to find the result.
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__y < __x); }

  /// Uses @c operator< to find the result.
  template<class _T1, class _T2>
    inline _GLIBCXX_CONSTEXPR bool
    operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
    { return !(__x < __y); }

#if __cplusplus >= 201103L
  /// See std::pair::swap().
  // Note:  no std::swap overloads in C++03 mode, this has performance
  //        implications, see, eg, libstdc++/38466.
  template<class _T1, class _T2>
    inline void
    swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }
#endif

  /**
   *  @brief A convenience wrapper for creating a pair from two objects.
   *  @param  __x  The first object.
   *  @param  __y  The second object.
   *  @return   A newly-constructed pair<> object of the appropriate type.
   *
   *  The standard requires that the objects be passed by reference-to-const,
   *  but LWG issue #181 says they should be passed by const value.  We follow
   *  the LWG by default.
   */
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 181.  make_pair() unintended behavior
#if __cplusplus >= 201103L
  // NB: DR 706.
  template<class _T1, class _T2>
    constexpr pair<typename __decay_and_strip<_T1>::__type,
                   typename __decay_and_strip<_T2>::__type>
    make_pair(_T1&& __x, _T2&& __y)
    {
      typedef typename __decay_and_strip<_T1>::__type __ds_type1;
      typedef typename __decay_and_strip<_T2>::__type __ds_type2;
      typedef pair<__ds_type1, __ds_type2> 	      __pair_type;
      return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
    }
#else
  template<class _T1, class _T2>
    inline pair<_T1, _T2>
    make_pair(_T1 __x, _T2 __y)
    { return pair<_T1, _T2>(__x, __y); }
#endif

  /// @}

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std

#endif /* _STL_PAIR_H */

Filemanager

Name Type Size Permission Actions
algorithmfwd.h File 20.66 KB 0644
alloc_traits.h File 17.66 KB 0644
allocator.h File 6.1 KB 0644
atomic_base.h File 24.99 KB 0644
atomic_lockfree_defines.h File 2.2 KB 0644
basic_ios.h File 14.76 KB 0644
basic_ios.tcc File 5.89 KB 0644
basic_string.h File 109.49 KB 0644
basic_string.tcc File 38.43 KB 0644
boost_concept_check.h File 26.41 KB 0644
c++0x_warning.h File 1.47 KB 0644
char_traits.h File 16.95 KB 0644
codecvt.h File 16.23 KB 0644
concept_check.h File 3.26 KB 0644
cpp_type_traits.h File 9.56 KB 0644
cxxabi_forced.h File 1.77 KB 0644
deque.tcc File 31.91 KB 0644
exception_defines.h File 1.6 KB 0644
exception_ptr.h File 5.29 KB 0644
forward_list.h File 46.72 KB 0644
forward_list.tcc File 15.17 KB 0644
fstream.tcc File 28.3 KB 0644
functexcept.h File 3.04 KB 0644
functional_hash.h File 6.05 KB 0644
gslice.h File 5.39 KB 0644
gslice_array.h File 7.59 KB 0644
hash_bytes.h File 2.1 KB 0644
hashtable.h File 61.05 KB 0644
hashtable_policy.h File 52.72 KB 0644
indirect_array.h File 7.68 KB 0644
ios_base.h File 27.85 KB 0644
istream.tcc File 30.36 KB 0644
list.tcc File 12.2 KB 0644
locale_classes.h File 22.45 KB 0644
locale_classes.tcc File 8.18 KB 0644
locale_facets.h File 88.84 KB 0644
locale_facets.tcc File 38.02 KB 0644
locale_facets_nonio.h File 63.51 KB 0644
locale_facets_nonio.tcc File 40.85 KB 0644
localefwd.h File 5.1 KB 0644
mask_array.h File 7.41 KB 0644
memoryfwd.h File 2.36 KB 0644
move.h File 5.67 KB 0644
nested_exception.h File 4.58 KB 0644
ostream.tcc File 12.03 KB 0644
ostream_insert.h File 3.91 KB 0644
postypes.h File 8.02 KB 0644
ptr_traits.h File 5.17 KB 0644
random.h File 173.19 KB 0644
random.tcc File 106.59 KB 0644
range_access.h File 3.06 KB 0644
regex.h File 83.49 KB 0644
regex_compiler.h File 27.68 KB 0644
regex_constants.h File 10.81 KB 0644
regex_cursor.h File 2.7 KB 0644
regex_error.h File 4.5 KB 0644
regex_grep_matcher.h File 4.23 KB 0644
regex_grep_matcher.tcc File 5.41 KB 0644
regex_nfa.h File 10.65 KB 0644
regex_nfa.tcc File 4.85 KB 0644
shared_ptr.h File 18.97 KB 0644
shared_ptr_base.h File 40.65 KB 0644
slice_array.h File 9.12 KB 0644
sstream.tcc File 9.27 KB 0644
stl_algo.h File 212.55 KB 0644
stl_algobase.h File 41.41 KB 0644
stl_bvector.h File 28.98 KB 0644
stl_construct.h File 5.05 KB 0644
stl_deque.h File 66.41 KB 0644
stl_function.h File 22.06 KB 0644
stl_heap.h File 19.99 KB 0644
stl_iterator.h File 35.77 KB 0644
stl_iterator_base_funcs.h File 6.8 KB 0644
stl_iterator_base_types.h File 8.19 KB 0644
stl_list.h File 52.83 KB 0644
stl_map.h File 36.78 KB 0644
stl_multimap.h File 33.94 KB 0644
stl_multiset.h File 28.37 KB 0644
stl_numeric.h File 13.5 KB 0644
stl_pair.h File 9.63 KB 0644
stl_queue.h File 18.21 KB 0644
stl_raw_storage_iter.h File 3.37 KB 0644
stl_relops.h File 4.49 KB 0644
stl_set.h File 28.61 KB 0644
stl_stack.h File 9.65 KB 0644
stl_tempbuf.h File 8.15 KB 0644
stl_tree.h File 53.56 KB 0644
stl_uninitialized.h File 19.95 KB 0644
stl_vector.h File 48.64 KB 0644
stream_iterator.h File 6.44 KB 0644
streambuf.tcc File 4.81 KB 0644
streambuf_iterator.h File 12.33 KB 0644
stringfwd.h File 2.37 KB 0644
unique_ptr.h File 17.19 KB 0644
unordered_map.h File 47.76 KB 0644
unordered_set.h File 43.25 KB 0644
uses_allocator.h File 3.49 KB 0644
valarray_after.h File 22.12 KB 0644
valarray_array.h File 21.23 KB 0644
valarray_array.tcc File 7.08 KB 0644
valarray_before.h File 18.08 KB 0644
vector.tcc File 25.55 KB 0644