mirror of
https://github.com/pocoproject/poco.git
synced 2025-06-01 21:03:39 +02:00
GH #240: VERY strange error only when including Format.hinclude Alignment.h early
GH #240: VERY strange error only when including Format.h (include Alignment.h early for consistency)
This commit is contained in:
parent
20e1cf8821
commit
a49f5da54b
@ -54,21 +54,31 @@
|
||||
#define Foundation_AlignOf_INCLUDED
|
||||
|
||||
|
||||
namespace Poco {
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
|
||||
|
||||
template <typename T>
|
||||
struct AlignmentCalcImpl
|
||||
{
|
||||
#include <type_traits>
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <typename T>
|
||||
struct AlignmentCalcImpl
|
||||
{
|
||||
char x;
|
||||
T t;
|
||||
private:
|
||||
private:
|
||||
AlignmentCalcImpl() {} // Never instantiate.
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
struct AlignOf
|
||||
template <typename T>
|
||||
struct AlignOf
|
||||
/// A templated class that contains an enum value representing
|
||||
/// the alignment of the template argument. For example,
|
||||
/// AlignOf<int>::Alignment represents the alignment of type "int". The
|
||||
@ -76,7 +86,7 @@ struct AlignOf
|
||||
/// the "desired" alignment returned by GCC's __alignof__ (for example). Note
|
||||
/// that because the alignment is an enum value, it can be used as a
|
||||
/// compile-time constant (e.g., for template instantiation).
|
||||
{
|
||||
{
|
||||
enum
|
||||
{
|
||||
Alignment = static_cast<unsigned int>(sizeof(AlignmentCalcImpl<T>) - sizeof(T))
|
||||
@ -92,21 +102,21 @@ struct AlignOf
|
||||
enum { Alignment_LessEqual_8Bytes = Alignment <= 8 ? 1 : 0 };
|
||||
enum { Alignment_LessEqual_16Bytes = Alignment <= 16 ? 1 : 0 };
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
inline unsigned alignOf()
|
||||
template <typename T>
|
||||
inline unsigned alignOf()
|
||||
/// A templated function that returns the minimum alignment of
|
||||
/// of a type. This provides no extra functionality beyond the AlignOf
|
||||
/// class besides some cosmetic cleanliness. Example usage:
|
||||
/// alignOf<int>() returns the alignment of an int.
|
||||
{
|
||||
{
|
||||
return AlignOf<T>::Alignment;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
/// Helper for building an aligned character array type.
|
||||
///
|
||||
/// This template is used to explicitly build up a collection of aligned
|
||||
@ -117,8 +127,8 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
/// template parameters.
|
||||
|
||||
|
||||
// MSVC requires special handling here.
|
||||
#ifndef _MSC_VER
|
||||
// MSVC requires special handling here.
|
||||
#ifndef _MSC_VER
|
||||
|
||||
#ifdef POCO_COMPILER_CLANG
|
||||
|
||||
@ -160,7 +170,7 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
#undef POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
|
||||
#else // _MSC_VER
|
||||
#else // _MSC_VER
|
||||
|
||||
// We provide special variations of this template for the most common
|
||||
// alignments because __declspec(align(...)) doesn't actually work when it is
|
||||
@ -189,15 +199,15 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
#undef POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
|
||||
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
#endif // _MSC_VER
|
||||
#endif // _MSC_VER
|
||||
|
||||
// POCO_HAVE_ALIGNMENT will be defined on the pre-C++11 platforms/compilers where
|
||||
// it can be reliably determined and used. Uncomment the line below to explicitly
|
||||
// disable use of alignment even for those platforms.
|
||||
// #undef POCO_HAVE_ALIGNMENT
|
||||
// POCO_HAVE_ALIGNMENT will be defined on the pre-C++11 platforms/compilers where
|
||||
// it can be reliably determined and used. Uncomment the line below to explicitly
|
||||
// disable use of alignment even for those platforms.
|
||||
// #undef POCO_HAVE_ALIGNMENT
|
||||
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
|
||||
template <typename T1, typename T2 = char, typename T3 = char, typename T4 = char>
|
||||
union AlignedCharArrayUnion
|
||||
@ -238,11 +248,14 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
private:
|
||||
Poco::AlignedCharArrayImpl<AlignOf<AlignerImpl>::Alignment> _nonceMember;
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
|
||||
} // namespace Poco
|
||||
} // namespace Poco
|
||||
|
||||
|
||||
#endif // POCO_ENABLE_CPP11
|
||||
|
||||
|
||||
#endif // Foundation_AlignOf_INCLUDED
|
||||
|
@ -40,13 +40,10 @@
|
||||
|
||||
#include "Poco/Exception.h"
|
||||
#include "Poco/MetaProgramming.h"
|
||||
#include "Poco/Alignment.h"
|
||||
#include <algorithm>
|
||||
#include <typeinfo>
|
||||
#include <cstring>
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
#include <type_traits>
|
||||
#endif
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
||||
|
@ -129,6 +129,11 @@
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Include alignment settings early
|
||||
//
|
||||
#include "Poco/Alignment.h"
|
||||
|
||||
//
|
||||
// Cleanup inconsistencies
|
||||
//
|
||||
|
@ -46,12 +46,6 @@
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <vector>
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
#include <type_traits>
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
#else
|
||||
#include "Poco/Alignment.h"
|
||||
#endif
|
||||
|
||||
|
||||
namespace Poco {
|
||||
|
Loading…
x
Reference in New Issue
Block a user