ossrv_pub/boost_apis/boost/utility/compare_pointees.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 // Copyright (C) 2003, Fernando Luis Cacciola Carballal.
       
     2 //
       
     3 // Use, modification, and distribution is subject to the Boost Software
       
     4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
       
     5 // http://www.boost.org/LICENSE_1_0.txt)
       
     6 //
       
     7 // See http://www.boost.org/lib/optional for documentation.
       
     8 //
       
     9 // You are welcome to contact the author at:
       
    10 //  fernando_cacciola@hotmail.com
       
    11 //
       
    12 #ifndef BOOST_UTILITY_COMPARE_POINTEES_25AGO2003_HPP
       
    13 #define BOOST_UTILITY_COMPARE_POINTEES_25AGO2003_HPP
       
    14 
       
    15 #include<functional>
       
    16 
       
    17 namespace boost {
       
    18 
       
    19 // template<class OP> bool equal_pointees(OP const& x, OP const& y);
       
    20 // template<class OP> struct equal_pointees_t;
       
    21 //
       
    22 // Being OP a model of OptionalPointee (either a pointer or an optional):
       
    23 //
       
    24 // If both x and y have valid pointees, returns the result of (*x == *y)
       
    25 // If only one has a valid pointee, returns false.
       
    26 // If none have valid pointees, returns true.
       
    27 // No-throw
       
    28 template<class OptionalPointee>
       
    29 inline
       
    30 bool equal_pointees ( OptionalPointee const& x, OptionalPointee const& y )
       
    31 {
       
    32   return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
       
    33 }
       
    34 
       
    35 template<class OptionalPointee>
       
    36 struct equal_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
       
    37 {
       
    38   bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
       
    39     { return equal_pointees(x,y) ; }
       
    40 } ;
       
    41 
       
    42 // template<class OP> bool less_pointees(OP const& x, OP const& y);
       
    43 // template<class OP> struct less_pointees_t;
       
    44 //
       
    45 // Being OP a model of OptionalPointee (either a pointer or an optional):
       
    46 //
       
    47 // If y has not a valid pointee, returns false.
       
    48 // ElseIf x has not a valid pointee, returns true.
       
    49 // ElseIf both x and y have valid pointees, returns the result of (*x < *y)
       
    50 // No-throw
       
    51 template<class OptionalPointee>
       
    52 inline
       
    53 bool less_pointees ( OptionalPointee const& x, OptionalPointee const& y )
       
    54 {
       
    55   return !y ? false : ( !x ? true : (*x) < (*y) ) ;
       
    56 }
       
    57 
       
    58 template<class OptionalPointee>
       
    59 struct less_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
       
    60 {
       
    61   bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
       
    62     { return less_pointees(x,y) ; }
       
    63 } ;
       
    64 
       
    65 } // namespace boost
       
    66 
       
    67 #endif
       
    68