///////////////////////////////////////////////////////////////////////////
// FILE: utility (Utility templates)
//
// =========================================================================
//
//                          Open Watcom Project
//
// Copyright (c) 2004-2014 The Open Watcom Contributors. All Rights Reserved.
//
//    This file is automatically generated. Do not edit directly.
//
// =========================================================================
//
// Description: This header is part of the C++ standard library. It
//              defines a few useful helper templates that don't fit
//              well in any of the other headers.
///////////////////////////////////////////////////////////////////////////
#ifndef _UTILITY_INCLUDED
#define _UTILITY_INCLUDED

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#ifndef __cplusplus
 #error This header file requires C++
#endif

namespace std {

    namespace rel_ops {

        template< class Type >
        bool operator!=( const Type &x, const Type &y )
        {
            return( !( x == y ) );
        }

        template< class Type >
        bool operator>( const Type &x, const Type &y )
        {
            return( y < x );
        }

        template< class Type >
        bool operator<=( const Type &x, const Type &y )
        {
            return( !( y < x ) );
        }

        template< class Type >
        bool operator>=( const Type &x, const Type &y )
        {
            return( !( x < y ) );
        }

    } // namespace rel_ops


    // Pair support

    template< class Type1, class Type2 >
    struct pair {
        typedef Type1 first_type;
        typedef Type2 second_type;

        Type1 first;
        Type2 second;

        pair( ) :
            first( Type1( ) ), second( Type2( ) )
        { }

        pair( const Type1 &x, const Type2 &y ) :
            first( x ), second( y )
        { }

        template< class OtherType1, class OtherType2 >
        pair( const pair< OtherType1, OtherType2 > &other ) :
            first( other.first ), second( other.second )
        { }
    };

    template< class Type1, class Type2 >
    inline
    bool operator==( const pair< Type1, Type2 > &x,
                     const pair< Type1, Type2 > &y )
    {
        return( x.first == y.first && x.second == y.second );
    }

    template< class Type1, class Type2 >
    inline
    bool operator<( const pair< Type1, Type2 > &x,
                    const pair< Type1, Type2 > &y )
    {
        return( x.first < y.first ||
                ( !( y.first < x.first ) && x.second < y.second ) );
    }

    template< class Type1, class Type2 >
    inline
    bool operator!=( const pair< Type1, Type2 > &x,
                     const pair< Type1, Type2 > &y )
    {
        return( !(x == y) );
    }

    template< class Type1, class Type2 >
    inline
    bool operator>( const pair< Type1, Type2 > &x,
                    const pair< Type1, Type2 > &y )
    {
        return( y < x );
    }

    template< class Type1, class Type2 >
    inline
    bool operator>=( const pair< Type1, Type2 > &x,
                     const pair< Type1, Type2 > &y )
    {
        return( !(x < y) );
    }

    template< class Type1, class Type2 >
    inline
    bool operator<=( const pair< Type1, Type2 > &x,
                     const pair< Type1, Type2 > &y )
    {
        return( !(y < x) );
    }

    template< class Type1, class Type2 >
    inline
    pair< Type1, Type2 > make_pair( const Type1 &x, const Type2 &y )
    {
        return( pair< Type1, Type2 >( x, y ) );
    }
    
} // namespace std

#endif
