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

    #include "ordered_sample_pair_abstract.h"
    #include <limits>
    #include "../serialize.h"

    namespace dlib
    {

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

        class ordered_sample_pair
        {
        public:
            ordered_sample_pair(
            ) :
                _index1(0),
                _index2(0)
            {
                _distance = 1;
            }

            ordered_sample_pair (
                const unsigned long idx1,
                const unsigned long idx2
            )
            {
                _distance = 1;
                _index1 = idx1;
                _index2 = idx2;
            }

            ordered_sample_pair (
                const unsigned long idx1,
                const unsigned long idx2,
                const double dist
            )
            {
                _distance = dist;
                _index1 = idx1;
                _index2 = idx2;
            }

            const unsigned long& index1 (
            ) const { return _index1; }

            const unsigned long& index2 (
            ) const { return _index2; }

            const double& distance (
            ) const { return _distance; }

        private:
            unsigned long _index1;
            unsigned long _index2;
            double _distance;
        };

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

        inline bool operator == (
            const ordered_sample_pair& a,
            const ordered_sample_pair& b
        )
        {
            return a.index1() == b.index1() && a.index2() == b.index2();
        }

        inline bool operator != (
            const ordered_sample_pair& a,
            const ordered_sample_pair& b
        )
        {
            return !(a == b);
        }

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

        inline void serialize (
            const ordered_sample_pair& item,
            std::ostream& out
        )
        {
            try
            {
                serialize(item.index1(),out);
                serialize(item.index2(),out);
                serialize(item.distance(),out);
            }
            catch (serialization_error& e)
            {
                throw serialization_error(e.info + "\n   while serializing object of type ordered_sample_pair");
            }
        }

        inline void deserialize (
            ordered_sample_pair& item,
            std::istream& in
        )
        {
            try
            {
                unsigned long idx1, idx2;
                double dist;

                deserialize(idx1,in);
                deserialize(idx2,in);
                deserialize(dist,in);
                item = ordered_sample_pair(idx1, idx2, dist);
            }
            catch (serialization_error& e)
            {
                throw serialization_error(e.info + "\n   while deserializing object of type ordered_sample_pair");
            }
        }

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

    }

    #endif // DLIB_ORDERED_SAMPLE_PaIR_Hh_