/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Copyright 2018 Danny Robson <danny@nerdcruft.net>
 */

#pragma once

#include <type_traits>


namespace cruft::buffer {
    ///////////////////////////////////////////////////////////////////////////
    /// A trait that evaluates to true if the queried type models cruft::allocator
    template <
        typename BufferT,
        typename = std::void_t<>
    >
    struct is_buffer
        : public std::false_type
    { };


    //-------------------------------------------------------------------------
    template <typename BufferT>
    struct is_buffer<BufferT,
        std::void_t<
            // Provides aligned and unaligned allocation
            decltype(std::declval<BufferT> ().begin ()),
            decltype(std::declval<BufferT> ().end   ()),
            decltype(std::declval<BufferT> ().size  ()),
            void
        >
    > : public std::true_type
    { };


    //-------------------------------------------------------------------------
    template <typename BufferT>
    constexpr auto is_buffer_v = is_buffer<BufferT>::value;
}