%PDF- %PDF-
| Direktori : /usr/include/xsimd/memory/ |
| Current File : //usr/include/xsimd/memory/xsimd_alignment.hpp |
/***************************************************************************
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
* Martin Renou *
* Copyright (c) QuantStack *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#ifndef XSIMD_ALIGNMENT_HPP
#define XSIMD_ALIGNMENT_HPP
#include "../config/xsimd_align.hpp"
#include "xsimd_aligned_allocator.hpp"
namespace xsimd
{
/**
* @struct aligned_mode
* @brief tag for load and store of aligned memory.
*/
struct aligned_mode
{
};
/**
* @struct unaligned_mode
* @brief tag for load and store of unaligned memory.
*/
struct unaligned_mode
{
};
/***********************
* Allocator alignment *
***********************/
template <class A>
struct allocator_alignment
{
using type = unaligned_mode;
};
#if defined(XSIMD_DEFAULT_ALIGNMENT)
template <class T>
struct allocator_alignment<aligned_allocator<T, XSIMD_DEFAULT_ALIGNMENT>>
{
using type = aligned_mode;
};
#endif
template <class A>
using allocator_alignment_t = typename allocator_alignment<A>::type;
/***********************
* container alignment *
***********************/
namespace detail
{
template <class T>
struct void_t
{
using type = void;
};
}
template <class C, class = void>
struct container_alignment
{
using type = unaligned_mode;
};
template <class C>
struct container_alignment<C, typename detail::void_t<typename C::allocator_type>::type>
{
using type = allocator_alignment_t<typename C::allocator_type>;
};
template <class C>
using container_alignment_t = typename container_alignment<C>::type;
}
#endif