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

    #ifndef DLIB_FFMPEG_SINK
    #define DLIB_FFMPEG_SINK

    #include <cstdint>
    #include <vector>
    #include <ostream>
    #include "../type_traits.h"

    namespace dlib
    {
        namespace ffmpeg
        {

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

            template <
              class Byte,
              class Allocator,
              std::enable_if_t<is_byte<Byte>::value, bool> = true
            >
            auto sink(std::vector<Byte, Allocator>& buf)
            /*!
                requires
                    - Byte must be a byte type, e.g. char, int8_t or uint8_t
                ensures
                    - returns a function object with signature bool(std::size_t N, const char* data).  When
                      called that function appends the first N bytes pointed to by data onto the end of buf.
                    - The returned function is valid only as long as buf exists.
                    - The function always returns true.
            !*/
            {
                return [&](std::size_t ndata, const char* data) {
                    buf.insert(buf.end(), data, data + ndata);
                    return true;
                };
            }

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

            inline auto sink(std::ostream& out)
            /*!
                ensures
                    - returns a function object with signature bool(std::size_t N, const char* data).  When
                      called that function writes the first N bytes pointed to by data to out.
                    - The returned view is valid only as long as out exists.
                    - Returns out.good(). I.e. returns true if the write to the stream succeeded and false otherwise.
            !*/
            {
                return [&](std::size_t ndata, const char* data) {
                    out.write(data, ndata);
                    return out.good();
                };
            }

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

        }
    }

    #endif //DLIB_FFMPEG_SINK