home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / stl_pair.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  6KB  |  148 lines

  1. // Pair implementation -*- C++ -*-
  2.  
  3. // Copyright (C) 2001, 2004 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 2, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // You should have received a copy of the GNU General Public License along
  17. // with this library; see the file COPYING.  If not, write to the Free
  18. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  19. // USA.
  20.  
  21. // As a special exception, you may use this file as part of a free software
  22. // library without restriction.  Specifically, if other files instantiate
  23. // templates or use macros or inline functions from this file, or you compile
  24. // this file and link it with other files to produce an executable, this
  25. // file does not by itself cause the resulting executable to be covered by
  26. // the GNU General Public License.  This exception does not however
  27. // invalidate any other reasons why the executable file might be covered by
  28. // the GNU General Public License.
  29.  
  30. /*
  31.  *
  32.  * Copyright (c) 1994
  33.  * Hewlett-Packard Company
  34.  *
  35.  * Permission to use, copy, modify, distribute and sell this software
  36.  * and its documentation for any purpose is hereby granted without fee,
  37.  * provided that the above copyright notice appear in all copies and
  38.  * that both that copyright notice and this permission notice appear
  39.  * in supporting documentation.  Hewlett-Packard Company makes no
  40.  * representations about the suitability of this software for any
  41.  * purpose.  It is provided "as is" without express or implied warranty.
  42.  *
  43.  *
  44.  * Copyright (c) 1996,1997
  45.  * Silicon Graphics Computer Systems, Inc.
  46.  *
  47.  * Permission to use, copy, modify, distribute and sell this software
  48.  * and its documentation for any purpose is hereby granted without fee,
  49.  * provided that the above copyright notice appear in all copies and
  50.  * that both that copyright notice and this permission notice appear
  51.  * in supporting documentation.  Silicon Graphics makes no
  52.  * representations about the suitability of this software for any
  53.  * purpose.  It is provided "as is" without express or implied warranty.
  54.  */
  55.  
  56. /** @file stl_pair.h
  57.  *  This is an internal header file, included by other library headers.
  58.  *  You should not attempt to use it directly.
  59.  */
  60.  
  61. #ifndef _PAIR_H
  62. #define _PAIR_H 1
  63.  
  64. namespace std
  65. {
  66.   /// pair holds two objects of arbitrary type.
  67.   template<class _T1, class _T2>
  68.     struct pair
  69.     {
  70.       typedef _T1 first_type;    ///<  @c first_type is the first bound type
  71.       typedef _T2 second_type;   ///<  @c second_type is the second bound type
  72.  
  73.       _T1 first;                 ///< @c first is a copy of the first object
  74.       _T2 second;                ///< @c second is a copy of the second object
  75.  
  76.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  77.       // 265.  std::pair::pair() effects overly restrictive
  78.       /** The default constructor creates @c first and @c second using their
  79.        *  respective default constructors.  */
  80.       pair()
  81.       : first(), second() { }
  82.  
  83.       /** Two objects may be passed to a @c pair constructor to be copied.  */
  84.       pair(const _T1& __a, const _T2& __b)
  85.       : first(__a), second(__b) { }
  86.  
  87.       /** There is also a templated copy ctor for the @c pair class itself.  */
  88.       template<class _U1, class _U2>
  89.         pair(const pair<_U1, _U2>& __p)
  90.     : first(__p.first), second(__p.second) { }
  91.     };
  92.  
  93.   /// Two pairs of the same type are equal iff their members are equal.
  94.   template<class _T1, class _T2>
  95.     inline bool
  96.     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  97.     { return __x.first == __y.first && __x.second == __y.second; }
  98.  
  99.   /// <http://gcc.gnu.org/onlinedocs/libstdc++/20_util/howto.html#pairlt>
  100.   template<class _T1, class _T2>
  101.     inline bool
  102.     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  103.     { return __x.first < __y.first
  104.          || (!(__y.first < __x.first) && __x.second < __y.second); }
  105.  
  106.   /// Uses @c operator== to find the result.
  107.   template<class _T1, class _T2>
  108.     inline bool
  109.     operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  110.     { return !(__x == __y); }
  111.  
  112.   /// Uses @c operator< to find the result.
  113.   template<class _T1, class _T2>
  114.     inline bool
  115.     operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  116.     { return __y < __x; }
  117.  
  118.   /// Uses @c operator< to find the result.
  119.   template<class _T1, class _T2>
  120.     inline bool
  121.     operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  122.     { return !(__y < __x); }
  123.  
  124.   /// Uses @c operator< to find the result.
  125.   template<class _T1, class _T2>
  126.     inline bool
  127.     operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  128.     { return !(__x < __y); }
  129.  
  130.   /**
  131.    *  @brief A convenience wrapper for creating a pair from two objects.
  132.    *  @param  x  The first object.
  133.    *  @param  y  The second object.
  134.    *  @return   A newly-constructed pair<> object of the appropriate type.
  135.    *
  136.    *  The standard requires that the objects be passed by reference-to-const,
  137.    *  but LWG issue #181 says they should be passed by const value.  We follow
  138.    *  the LWG by default.
  139.    */
  140.   // _GLIBCXX_RESOLVE_LIB_DEFECTS
  141.   // 181.  make_pair() unintended behavior
  142.   template<class _T1, class _T2>
  143.     inline pair<_T1, _T2>
  144.     make_pair(_T1 __x, _T2 __y) { return pair<_T1, _T2>(__x, __y); }
  145. } // namespace std
  146.  
  147. #endif /* _PAIR_H */
  148.