// Copyright (C) 2005  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#ifndef DLIB_SET_COMPARe_1_
#define DLIB_SET_COMPARe_1_

#include "set_compare_abstract.h"

#include "../algs.h"



namespace dlib
{

    template <
        typename set_base 
        >
    class set_compare_1 : public set_base
    {

        public:

            bool operator< (
                const set_compare_1& rhs
            ) const;

            bool operator== (
                const set_compare_1& rhs
            ) const;

    };


    template <
        typename set_base
        >
    inline void swap (
        set_compare_1<set_base>& a, 
        set_compare_1<set_base>& b 
    ) { a.swap(b); }  

// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
    // member function definitions
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------

    template <
        typename set_base
        >
    bool set_compare_1<set_base>::
    operator< (
        const set_compare_1<set_base>& rhs
    ) const
    {
        bool result = false;
        if (set_base::size() < rhs.size())
            result = true;

        if (set_base::size() == rhs.size())
        {
            rhs.reset();
            set_base::reset();
            while (rhs.move_next())
            {
                set_base::move_next();
                if (set_base::element() < rhs.element())
                {
                    result = true;
                    break;
                }
                else if (rhs.element() < set_base::element())
                {
                    break;
                }
            }            
        }

        set_base::reset();
        rhs.reset();

        return result;
    }

// ----------------------------------------------------------------------------------------

    template <
        typename set_base
        >
    bool set_compare_1<set_base>::
    operator== (
        const set_compare_1<set_base>& rhs
    ) const
    {
        bool result = true;
        if (set_base::size() != rhs.size())
            result = false;


        rhs.reset();
        set_base::reset();
        while (rhs.move_next() && set_base::move_next())
        {            
            if (!(rhs.element() == set_base::element()))
            {
                result = false;
                break;
            }
        }

        set_base::reset();
        rhs.reset();

        return result;
    }

// ----------------------------------------------------------------------------------------

}

#endif // DLIB_SET_COMPARe_1_