sfizz/external/jsl/include/jsl/allocator
2021-01-04 02:04:43 +01:00

80 lines
2.5 KiB
C++

// -*- C++ -*-
// SPDX-License-Identifier: BSL-1.0
//
// Copyright Jean Pierre Cimalando 2018-2020.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
#include <limits>
#include <utility>
namespace jsl {
template <class T, class Traits>
struct ordinary_allocator {
typedef T value_type;
typedef T *pointer;
typedef const T *const_pointer;
typedef T &reference;
typedef const T &const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef std::true_type propagate_on_container_move_assignment;
template <class U> struct rebind { typedef ordinary_allocator<U, Traits> other; };
typedef std::true_type is_always_equal;
ordinary_allocator() noexcept {}
ordinary_allocator(const ordinary_allocator &) noexcept {}
template <class U> ordinary_allocator(const ordinary_allocator<U, Traits>&) noexcept {}
T *address(T &x) const noexcept;
const T *address(const T &x) const noexcept;
T *allocate(std::size_t n, const void * = nullptr);
void deallocate(T *p, std::size_t n) noexcept;
std::size_t max_size() const noexcept;
template <class U, class... Args> void construct(U *p, Args &&...args);
template <class U> void destroy(U *p);
};
template <class T, class Traits>
inline bool operator==(const ordinary_allocator<T, Traits> &, const ordinary_allocator<T, Traits> &) noexcept
{
return true;
}
template <class T, class Traits>
inline bool operator!=(const ordinary_allocator<T, Traits> &, const ordinary_allocator<T, Traits> &) noexcept
{
return false;
}
//------------------------------------------------------------------------------
struct stdc_allocator_traits {
static void *allocate(std::size_t n);
static void deallocate(void *p, std::size_t = 0);
};
template <class T>
using stdc_allocator = ordinary_allocator<T, stdc_allocator_traits>;
//------------------------------------------------------------------------------
template <std::size_t Al>
struct aligned_allocator_traits {
static void *allocate(std::size_t n);
static void deallocate(void *p, std::size_t = 0);
};
template <class T, std::size_t Al>
using aligned_allocator = ordinary_allocator<T, aligned_allocator_traits<Al>>;
} // namespace jsl
#include "bits/allocator/ordinary_allocator.tcc"
#include "bits/allocator/stdc_allocator.tcc"
#include "bits/allocator/aligned_allocator.tcc"