X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Finclude%2Fbits%2Fstl_pair.h;h=fd395adbd0b3e1f321921df341bfd37d2d1a9ea5;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=b0411b2becc9e2cc1a5eed119136c78856d259dc;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index b0411b2b..fd395adb 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -1,11 +1,12 @@ // Pair implementation -*- C++ -*- -// Copyright (C) 2001 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +// 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) +// 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, @@ -13,19 +14,14 @@ // 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. +// 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. -// 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. +// 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 +// . /* * @@ -58,100 +54,208 @@ * You should not attempt to use it directly. */ -#ifndef __GLIBCPP_INTERNAL_PAIR_H -#define __GLIBCPP_INTERNAL_PAIR_H - -namespace std -{ - -/// pair holds two objects of arbitrary type. -template -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 -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -//265. std::pair::pair() effects overly restrictive - /** The default constructor creates @c first and @c second using their - * respective default constructors. */ - pair() : first(), second() {} -#else - pair() : first(_T1()), second(_T2()) {} +#ifndef _STL_PAIR_H +#define _STL_PAIR_H 1 + +#include // for std::move / std::forward, std::decay, and + // std::swap + +_GLIBCXX_BEGIN_NAMESPACE(std) + + /// pair holds two objects of arbitrary type. + template + 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. */ + pair() + : first(), second() { } + + /** Two objects may be passed to a @c pair constructor to be copied. */ + pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template + pair(_U1&& __x, _U2&& __y) + : first(std::forward<_U1>(__x)), + second(std::forward<_U2>(__y)) { } + + pair(pair&& __p) + : first(std::move(__p.first)), + second(std::move(__p.second)) { } #endif - /** Two objects may be passed to a @c pair constructor to be copied. */ - pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {} - - /** There is also a templated copy ctor for the @c pair class itself. */ - template - pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} -}; - -/// Two pairs of the same type are equal iff their members are equal. -template -inline bool operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) -{ - return __x.first == __y.first && __x.second == __y.second; -} - -/// -template -inline 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 -inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { - return !(__x == __y); -} - -/// Uses @c operator< to find the result. -template -inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { - return __y < __x; -} - -/// Uses @c operator< to find the result. -template -inline bool operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { - return !(__y < __x); -} - -/// Uses @c operator< to find the result. -template -inline bool operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) { - return !(__x < __y); -} - -/** - * @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. -*/ -template -#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS -//181. make_pair() unintended behavior -inline pair<_T1, _T2> make_pair(_T1 __x, _T2 __y) -#else -inline pair<_T1, _T2> make_pair(const _T1& __x, const _T2& __y) + + /** There is also a templated copy ctor for the @c pair class itself. */ + template + pair(const pair<_U1, _U2>& __p) + : first(__p.first), + second(__p.second) { } + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template + pair(pair<_U1, _U2>&& __p) + : first(std::move(__p.first)), + second(std::move(__p.second)) { } + + // http://gcc.gnu.org/ml/libstdc++/2007-08/msg00052.html + template + pair(_U1&& __x, _Arg0&& __arg0, _Args&&... __args) + : first(std::forward<_U1>(__x)), + second(std::forward<_Arg0>(__arg0), + std::forward<_Args>(__args)...) { } + + pair& + operator=(pair&& __p) + { + first = std::move(__p.first); + second = std::move(__p.second); + return *this; + } + + template + pair& + operator=(pair<_U1, _U2>&& __p) + { + first = std::move(__p.first); + second = std::move(__p.second); + return *this; + } + + void + swap(pair&& __p) + { + using std::swap; + swap(first, __p.first); + swap(second, __p.second); + } #endif -{ - return pair<_T1, _T2>(__x, __y); -} + }; -} // namespace std + /// Two pairs of the same type are equal iff their members are equal. + template + inline bool + operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return __x.first == __y.first && __x.second == __y.second; } + + /// + template + inline 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 + inline bool + operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__x == __y); } + + /// Uses @c operator< to find the result. + template + inline bool + operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return __y < __x; } + + /// Uses @c operator< to find the result. + template + inline bool + operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__y < __x); } + + /// Uses @c operator< to find the result. + template + inline bool + operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) + { return !(__x < __y); } + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + /// See std::pair::swap(). + // Note: no std::swap overloads in C++03 mode, this has performance + // implications, see, eg, libstdc++/38466. + template + inline void + swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) + { __x.swap(__y); } + + template + inline void + swap(pair<_T1, _T2>&& __x, pair<_T1, _T2>& __y) + { __x.swap(__y); } + + template + inline void + swap(pair<_T1, _T2>& __x, pair<_T1, _T2>&& __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 +#ifndef __GXX_EXPERIMENTAL_CXX0X__ + template + inline pair<_T1, _T2> + make_pair(_T1 __x, _T2 __y) + { return pair<_T1, _T2>(__x, __y); } +#else + template + class reference_wrapper; + + // Helper which adds a reference to a type when given a reference_wrapper + template + struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + + template + struct __strip_reference_wrapper > + { + typedef _Tp& __type; + }; + + template + struct __strip_reference_wrapper > + { + typedef _Tp& __type; + }; + + template + struct __decay_and_strip + { + typedef typename __strip_reference_wrapper< + typename decay<_Tp>::type>::__type __type; + }; + + // NB: DR 706. + template + inline pair::__type, + typename __decay_and_strip<_T2>::__type> + make_pair(_T1&& __x, _T2&& __y) + { + return pair::__type, + typename __decay_and_strip<_T2>::__type> + (std::forward<_T1>(__x), std::forward<_T2>(__y)); + } +#endif -#endif /* __GLIBCPP_INTERNAL_PAIR_H */ +_GLIBCXX_END_NAMESPACE -// Local Variables: -// mode:C++ -// End: +#endif /* _STL_PAIR_H */