    // 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_