    // Copyright (C) 2003  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_QUEUE_SORt_ABSTRACT_
    #ifdef DLIB_QUEUE_SORt_ABSTRACT_

    #include "queue_kernel_abstract.h"

    namespace dlib
    {

        template <
            typename queue_base
            >
        class queue_sort : public queue_base
        {

            /*!
                REQUIREMENTS ON QUEUE_BASE
                    - is an implementation of queue/queue_kernel_abstract.h
                    - queue_base::type must be a type with that is comparable via operator<

                POINTERS AND REFERENCES TO INTERNAL DATA
                    sort() may invalidate pointers and references to internal data.

                WHAT THIS EXTENSION DOES FOR QUEUE
                    This gives a queue the ability to sort its contents by calling sort().
            !*/

            public:

                void sort (
                );
                /*!
                    ensures
                        - for all elements in #*this the ith element is <= the i+1 element
                        - #at_start() == true
                    throws
                        - std::bad_alloc or any exception thrown by T's constructor
                            data may be lost if sort() throws
                !*/

                template <typename compare_type>
                void sort (
                    const compare_type& compare
                );
                /*!
                    ensures
                        - for all elements in #*this the ith element is <= the i+1 element
                        - uses compare(a,b) as the < operator.  So if compare(a,b) == true
                          then a comes before b in the resulting ordering.
                        - #at_start() == true
                    throws
                        - std::bad_alloc or any exception thrown by T's constructor
                            data may be lost if sort() throws
                !*/
        };

        template <
            template queue_base
            >
        inline void swap (
            queue_sort<queue_base>& a,
            queue_sort<queue_base>& b
        ) { a.swap(b); }
        /*!
            provides a global swap function
        !*/

    }

    #endif // DLIB_QUEUE_SORt_ABSTRACT_