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

    #include "../algs.h"

    namespace dlib
    {

        class byte_orderer
        {
            /*!
                INITIAL VALUE
                    This object has no state.

                WHAT THIS OBJECT REPRESENTS
                    This object simply provides a mechanism to convert data from a
                    host machine's own byte ordering to big or little endian and to
                    also do the reverse.

                    It also provides a pair of functions to convert to/from network byte
                    order where network byte order is big endian byte order.  This pair of
                    functions does the exact same thing as the host_to_big() and big_to_host()
                    functions and is provided simply so that client code can use the most
                    self documenting name appropriate.

                    Also note that this object is capable of correctly flipping the contents
                    of arrays when the arrays are declared on the stack.  e.g.  You can
                    say things like:
                    int array[10];
                    bo.host_to_network(array);
            !*/

        public:

            byte_orderer (
            );
            /*!
                ensures
                    - #*this is properly initialized
                throws
                    - std::bad_alloc
            !*/

            virtual ~byte_orderer (
            );
            /*!
                ensures
                    - any resources associated with *this have been released
            !*/

            bool host_is_big_endian (
            ) const;
            /*!
                ensures
                    - if (the host computer is a big endian machine) then
                        - returns true
                    - else
                        - returns false
            !*/

            bool host_is_little_endian (
            ) const;
            /*!
                ensures
                    - if (the host computer is a little endian machine) then
                        - returns true
                    - else
                        - returns false
            !*/

            template <
                typename T
                >
            void host_to_network (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from host byte order
                      to network byte order.
            !*/

            template <
                typename T
                >
            void network_to_host (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from network byte order
                      to host byte order.
            !*/

            template <
                typename T
                >
            void host_to_big (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from host byte order
                      to big endian byte order.
            !*/

            template <
                typename T
                >
            void big_to_host (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from big endian byte order
                      to host byte order.
            !*/

            template <
                typename T
                >
            void host_to_little (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from host byte order
                      to little endian byte order.
            !*/

            template <
                typename T
                >
            void little_to_host (
                T& item
            ) const;
            /*!
                ensures
                    - #item == the value of item converted from little endian byte order
                      to host byte order.
            !*/

        };
    }

    #endif // DLIB_BYTE_ORDEREr_ABSTRACT_