forked from boostorg/smart_ptr
Special case aligning up sizes and change integral constant style
This commit is contained in:
@@ -93,13 +93,16 @@ struct sp_array_scalar<const volatile T[]> {
|
|||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
struct sp_array_count {
|
struct sp_array_count {
|
||||||
BOOST_STATIC_CONSTEXPR std::size_t value = 1;
|
enum {
|
||||||
|
value = 1
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T, std::size_t N>
|
template<class T, std::size_t N>
|
||||||
struct sp_array_count<T[N]> {
|
struct sp_array_count<T[N]> {
|
||||||
BOOST_STATIC_CONSTEXPR std::size_t value = N *
|
enum {
|
||||||
sp_array_count<T>::value;
|
value = N * sp_array_count<T>::value
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -122,7 +125,9 @@ struct sp_array_storage {
|
|||||||
|
|
||||||
template<std::size_t N, std::size_t M>
|
template<std::size_t N, std::size_t M>
|
||||||
struct sp_max_size {
|
struct sp_max_size {
|
||||||
BOOST_STATIC_CONSTEXPR std::size_t value = N < M ? M : N;
|
enum {
|
||||||
|
value = N < M ? M : N
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
|
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
|
||||||
@@ -138,12 +143,12 @@ struct sp_bind_allocator {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<bool>
|
template<bool, class = void>
|
||||||
struct sp_enable { };
|
struct sp_enable { };
|
||||||
|
|
||||||
template<>
|
template<class T>
|
||||||
struct sp_enable<true> {
|
struct sp_enable<true, T> {
|
||||||
typedef void type;
|
typedef T type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -344,6 +349,14 @@ sp_array_default(T* storage, std::size_t size)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
struct sp_less_align {
|
||||||
|
enum {
|
||||||
|
value = (boost::alignment_of<T>::value <
|
||||||
|
boost::alignment_of<U>::value)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
BOOST_CONSTEXPR inline std::size_t
|
BOOST_CONSTEXPR inline std::size_t
|
||||||
sp_objects(std::size_t size) BOOST_NOEXCEPT
|
sp_objects(std::size_t size) BOOST_NOEXCEPT
|
||||||
@@ -352,12 +365,21 @@ sp_objects(std::size_t size) BOOST_NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class U>
|
template<class T, class U>
|
||||||
BOOST_CONSTEXPR inline std::size_t
|
BOOST_CONSTEXPR inline
|
||||||
|
typename sp_enable<sp_less_align<T, U>::value, std::size_t>::type
|
||||||
sp_align(std::size_t size) BOOST_NOEXCEPT
|
sp_align(std::size_t size) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return (sizeof(T) * size + sizeof(U) - 1) & ~(sizeof(U) - 1);
|
return (sizeof(T) * size + sizeof(U) - 1) & ~(sizeof(U) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T, class U>
|
||||||
|
BOOST_CONSTEXPR inline
|
||||||
|
typename sp_enable<!sp_less_align<T, U>::value, std::size_t>::type
|
||||||
|
sp_align(std::size_t size) BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return sizeof(T) * size;
|
||||||
|
}
|
||||||
|
|
||||||
template<class T, std::size_t N>
|
template<class T, std::size_t N>
|
||||||
class sp_size_array_deleter {
|
class sp_size_array_deleter {
|
||||||
public:
|
public:
|
||||||
|
Reference in New Issue
Block a user