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

    #include "../algs.h"
    #include "base64_kernel_abstract.h"
    #include <iosfwd>

    namespace dlib
    {

        class base64
        {
            /*!
                INITIAL VALUE
                    - bad_value == 100
                    - encode_table == a pointer to an array of 64 chars
                    - where x is a 6 bit value the following is true:
                        - encode_table[x] == the base64 encoding of x
                    - decode_table == a pointer to an array of UCHAR_MAX chars
                    - where x is any char value:
                        - if (x is a valid character in the base64 coding scheme) then
                            - decode_table[x] == the 6 bit value that x encodes
                        - else
                            - decode_table[x] == bad_value

                CONVENTION
                    - The state of this object never changes so just refer to its
                      initial value.

            !*/

        public:
            // this is here for backwards compatibility with older versions of dlib.
            typedef base64 kernel_1a;

            class decode_error : public dlib::error { public:
            decode_error( const std::string& e) : error(e) {}};

            base64 (
            );

            virtual ~base64 (
            );

            enum line_ending_type
            {
                CR,  // i.e. "\r"
                LF,  // i.e. "\n"
                CRLF // i.e. "\r\n"
            };

            line_ending_type line_ending (
            ) const;

            void set_line_ending (
                line_ending_type eol_style_
            );

            void encode (
                std::istream& in,
                std::ostream& out
            ) const;

            void decode (
                std::istream& in,
                std::ostream& out
            ) const;

        private:

            char* encode_table;
            unsigned char* decode_table;
            const unsigned char bad_value;
            line_ending_type eol_style;

            // restricted functions
            base64(base64&);        // copy constructor
            base64& operator=(base64&);    // assignment operator

        };

    }

    #ifdef NO_MAKEFILE
    #include "base64_kernel_1.cpp"
    #endif

    #endif // DLIB_BASE64_KERNEl_1_