// Copyright (C) 2003  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#ifndef DLIB_SEQUENCE_COMPARe_1_
#define DLIB_SEQUENCE_COMPARe_1_
#include "sequence_compare_abstract.h"
#include "../algs.h"
namespace dlib
{
    template <
        typename seq_base 
        >
    class sequence_compare_1 : public seq_base
    {
        typedef typename seq_base::type T;
    public:
        bool operator< (
            const sequence_compare_1& rhs
        ) const;
        bool operator== (
            const sequence_compare_1& rhs
        ) const;
    };
    template <
        typename seq_base
        >
    inline void swap (
        sequence_compare_1<seq_base>& a, 
        sequence_compare_1<seq_base>& b 
    ) { a.swap(b); }  
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// member function definitions
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
    template <
        typename seq_base
        >
    bool sequence_compare_1<seq_base>::
    operator< (
        const sequence_compare_1<seq_base>& rhs
    ) const
    {
        unsigned int length;
        if (this->size() < rhs.size())
            length = this->size();
        else
            length = rhs.size();
        for (unsigned long i = 0; i < length; ++i)
        {
            if ((*this)[i] < rhs[i])
                return true;
            else if ( !((*this)[i] == rhs[i]) )
                return false;
        }
        // they are equal so far
        if (this->size() < rhs.size())
            return true;
        else
            return false;
    }
// ----------------------------------------------------------------------------------------
    template <
        typename seq_base
        >
    bool sequence_compare_1<seq_base>::
    operator== (
        const sequence_compare_1<seq_base>& rhs
    ) const
    {
        if (this->size() != rhs.size())
            return false;
        for (unsigned long i = 0; i < this->size(); ++i)
        {
            if (!((*this)[i] == rhs[i]))
                return false;
        }
        return true;
    }
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_SEQUENCE_COMPARe_1_