diff --git a/Sources/Plasma/CoreLib/CMakeLists.txt b/Sources/Plasma/CoreLib/CMakeLists.txt index be0bf861..72b41932 100644 --- a/Sources/Plasma/CoreLib/CMakeLists.txt +++ b/Sources/Plasma/CoreLib/CMakeLists.txt @@ -8,17 +8,26 @@ add_definitions(-DPRODUCT_SHORT_NAME="${PRODUCT_SHORT_NAME}") add_definitions(-DPRODUCT_LONG_NAME="${PRODUCT_LONG_NAME}") add_definitions(-DPRODUCT_UUID="${PRODUCT_UUID}") -if(NOT WCHAR_BYTES) - include(CheckTypeSize) +include(CheckTypeSize) +if(NOT WCHAR_BYTES) check_type_size("wchar_t" WCHAR_BYTES) if(NOT WCHAR_BYTES) message(FATAL_ERROR "Could not determine sizeof(wchar_t)") set(WCHAR_BYTES 0) - endif(NOT WCHAR_BYTES) -endif(NOT WCHAR_BYTES) + endif() +endif() add_definitions(-DWCHAR_BYTES=${WCHAR_BYTES}) +if(NOT SIZEOF_LONG) + check_type_size("long" SIZEOF_LONG) + if(NOT SIZEOF_LONG) + message(FATAL_ERROR "Could not determine sizeof(long)") + set(SIZEOF_LONG 0) + endif() +endif() +add_definitions(-DSIZEOF_LONG=${SIZEOF_LONG}) + try_compile(HAVE_CPUID ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/cmake/check_cpuid.cpp OUTPUT_VARIABLE OUTPUT) diff --git a/Sources/Plasma/CoreLib/plFileSystem.h b/Sources/Plasma/CoreLib/plFileSystem.h index 8fe89b4f..4237f11c 100644 --- a/Sources/Plasma/CoreLib/plFileSystem.h +++ b/Sources/Plasma/CoreLib/plFileSystem.h @@ -227,10 +227,6 @@ inline plFileName operator+(const char *left, const plFileName &right) { return left + right.AsString(); } -// Shortcut for use in plFormat -PL_FORMAT_TYPE(const plFileName &) - - /** Structure to get information about a file by name. * \sa plFileName */ diff --git a/Sources/Plasma/CoreLib/plFormat.cpp b/Sources/Plasma/CoreLib/plFormat.cpp index eee0fd88..01ce94df 100644 --- a/Sources/Plasma/CoreLib/plFormat.cpp +++ b/Sources/Plasma/CoreLib/plFormat.cpp @@ -338,7 +338,7 @@ static plStringBuffer _formatChar(const plFormat_Private::FormatSpec &form #define _PL_FORMAT_IMPL_INT_TYPE(_stype, _utype) \ PL_FORMAT_IMPL(_stype) \ { \ - /* Note: The use of unsigned here is not a typo -- we only format decimal + /* Note: The use of unsigned here is not a typo -- we only format decimal \ values with a sign, so we can convert everything else to unsigned. */ \ switch (format.fDigitClass) { \ case plFormat_Private::kDigitBin: \ @@ -388,7 +388,9 @@ _PL_FORMAT_IMPL_INT_TYPE(signed char, unsigned char) _PL_FORMAT_IMPL_INT_TYPE(short, unsigned short) _PL_FORMAT_IMPL_INT_TYPE(int, unsigned) _PL_FORMAT_IMPL_INT_TYPE(long, unsigned long) +#if (SIZEOF_LONG == 4) _PL_FORMAT_IMPL_INT_TYPE(int64_t, uint64_t) +#endif PL_FORMAT_IMPL(char) { diff --git a/Sources/Plasma/CoreLib/plFormat.h b/Sources/Plasma/CoreLib/plFormat.h index 432ff7b7..f2940799 100644 --- a/Sources/Plasma/CoreLib/plFormat.h +++ b/Sources/Plasma/CoreLib/plFormat.h @@ -135,30 +135,13 @@ namespace plFormat_Private } /** Declare a formattable type for `plFormat`. + * \note PL_FORMAT_IMPL must only be used in plFormat.h, due to constraints + * on compile-time declaration order imposed by some compilers. * \sa PL_FORMAT_IMPL() */ #define PL_FORMAT_TYPE(_type) \ extern plStringBuffer _impl_plFormat_DataHandler( \ - const plFormat_Private::FormatSpec &format, _type value); \ - namespace plFormat_Private \ - { \ - template \ - plString _IFormat(_IFormatDataObject &data, _type value, _Args... args) \ - { \ - plFormat_Private::FormatSpec format = plFormat_Private::_FetchNextFormat(data); \ - data.fOutput.push_back(_impl_plFormat_DataHandler(format, value)); \ - return _IFormat(data, args...); \ - } \ - } \ - template \ - plString plFormat(const char *fmt_str, _type value, _Args... args) \ - { \ - plFormat_Private::_IFormatDataObject data; \ - data.fFormatStr = fmt_str; \ - plFormat_Private::FormatSpec format = plFormat_Private::_FetchNextFormat(data); \ - data.fOutput.push_back(_impl_plFormat_DataHandler(format, value)); \ - return plFormat_Private::_IFormat(data, args...); \ - } + const plFormat_Private::FormatSpec &format, _type value); /** Provide the implementation for a formattable type for `plFormat`. * \sa PL_FORMAT_TYPE(), PL_FORMAT_FORWARD() @@ -191,37 +174,80 @@ namespace plFormat_Private #define PL_FORMAT_FORWARD(format, fwd_value) \ _impl_plFormat_DataHandler((format), (fwd_value)) -PL_FORMAT_TYPE(char) -PL_FORMAT_TYPE(wchar_t) -PL_FORMAT_TYPE(signed char) -PL_FORMAT_TYPE(unsigned char) -PL_FORMAT_TYPE(short) -PL_FORMAT_TYPE(unsigned short) -PL_FORMAT_TYPE(int) -PL_FORMAT_TYPE(unsigned) -PL_FORMAT_TYPE(long) -PL_FORMAT_TYPE(unsigned long) -PL_FORMAT_TYPE(int64_t) -PL_FORMAT_TYPE(uint64_t) -PL_FORMAT_TYPE(const char *) -PL_FORMAT_TYPE(const wchar_t *) -PL_FORMAT_TYPE(const plString &) - -// TODO: Remove these when they're no longer needed -PL_FORMAT_TYPE(const std::string &) -PL_FORMAT_TYPE(const std::wstring &) - -// TODO: Implement floating point types (float, double). They're harder -// than the others, so I'll get around to them later >.> - -// Formats as "true" or "false", following normal string formatting rules. -// To use other formats, don't pass us a bool directly... -PL_FORMAT_TYPE(bool) +// ==================================== +// BEGIN: Formattable type declarations +// ==================================== + + PL_FORMAT_TYPE(char) + PL_FORMAT_TYPE(wchar_t) + PL_FORMAT_TYPE(signed char) + PL_FORMAT_TYPE(unsigned char) + PL_FORMAT_TYPE(short) + PL_FORMAT_TYPE(unsigned short) + PL_FORMAT_TYPE(int) + PL_FORMAT_TYPE(unsigned) + PL_FORMAT_TYPE(long) + PL_FORMAT_TYPE(unsigned long) +#if (SIZEOF_LONG == 4) + PL_FORMAT_TYPE(int64_t) + PL_FORMAT_TYPE(uint64_t) +#endif + PL_FORMAT_TYPE(const char *) + PL_FORMAT_TYPE(const wchar_t *) + PL_FORMAT_TYPE(const plString &) + + // Shortcut for plFileName + PL_FORMAT_TYPE(const class plFileName &) + + // TODO: Remove these when they're no longer needed + PL_FORMAT_TYPE(const std::string &) + PL_FORMAT_TYPE(const std::wstring &) + + // TODO: Implement floating point types (float, double). They're harder + // than the others, so I'll get around to them later >.> + + // Formats as "true" or "false", following normal string formatting rules. + // To use other formats, don't pass us a bool directly... + PL_FORMAT_TYPE(bool) + + // Formats for plUoid + PL_FORMAT_TYPE(const class plLocation &) + PL_FORMAT_TYPE(const class plUoid &) + + // Format for plUUID + PL_FORMAT_TYPE(const class plUUID &) + +// ================================== +// END: Formattable type declarations +// ================================== + +// NOTE: Added in order to work properly in GCC/Clang; all PL_FORMAT_TYPE +// declarations MUST be above this line. +#undef PL_FORMAT_TYPE namespace plFormat_Private { // End of the chain -- emits the last piece (if any) and builds the final string plString _IFormat(_IFormatDataObject &data); + + // Internal plFormat implementation which carries over the pieces formatted so far + template + plString _IFormat(_IFormatDataObject &data, _Type value, _Args... args) + { + plFormat_Private::FormatSpec format = plFormat_Private::_FetchNextFormat(data); + data.fOutput.push_back(_impl_plFormat_DataHandler(format, value)); + return _IFormat(data, args...); + } +} + +template +plString plFormat(const char *fmt_str, _Type value, _Args... args) +{ + plFormat_Private::_IFormatDataObject data; + data.fFormatStr = fmt_str; + plFormat_Private::FormatSpec format = plFormat_Private::_FetchNextFormat(data); + data.fOutput.push_back(_impl_plFormat_DataHandler(format, value)); + return plFormat_Private::_IFormat(data, args...); } #endif // plFormat_Defined diff --git a/Sources/Plasma/NucleusLib/pnKeyedObject/plUoid.h b/Sources/Plasma/NucleusLib/pnKeyedObject/plUoid.h index 0c1d7255..a8e7fbe7 100644 --- a/Sources/Plasma/NucleusLib/pnKeyedObject/plUoid.h +++ b/Sources/Plasma/NucleusLib/pnKeyedObject/plUoid.h @@ -144,8 +144,6 @@ public: static const plLocation kInvalidLoc; }; -PL_FORMAT_TYPE(const plLocation &) - //// plUoid ////////////////////////////////////////////////////////////////// class plUoid @@ -200,6 +198,4 @@ protected: plLoadMask fLoadMask; }; -PL_FORMAT_TYPE(const plUoid &) - #endif // plUoid_h_inc diff --git a/Sources/Plasma/NucleusLib/pnUUID/pnUUID.h b/Sources/Plasma/NucleusLib/pnUUID/pnUUID.h index d7dce497..e24b50b1 100644 --- a/Sources/Plasma/NucleusLib/pnUUID/pnUUID.h +++ b/Sources/Plasma/NucleusLib/pnUUID/pnUUID.h @@ -96,6 +96,4 @@ public: static plUUID Generate(); }; -PL_FORMAT_TYPE(const plUUID &) - #endif // pnUUID_h_inc