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.h b/Sources/Plasma/CoreLib/plFormat.h index 2c969a24..f2940799 100644 --- a/Sources/Plasma/CoreLib/plFormat.h +++ b/Sources/Plasma/CoreLib/plFormat.h @@ -132,30 +132,11 @@ namespace plFormat_Private }; extern FormatSpec _FetchNextFormat(_IFormatDataObject &data); - - 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...); - } - - // End of the chain -- emits the last piece (if any) and builds the final string - plString _IFormat(_IFormatDataObject &data); -} - -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...); } /** 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) \ @@ -193,33 +174,80 @@ plString plFormat(const char *fmt_str, _Type value, _Args... args) #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) +// ==================================== +// 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) + 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 &) + 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) -// TODO: Remove these when they're no longer needed -PL_FORMAT_TYPE(const std::string &) -PL_FORMAT_TYPE(const std::wstring &) + // Formats for plUoid + PL_FORMAT_TYPE(const class plLocation &) + PL_FORMAT_TYPE(const class plUoid &) -// TODO: Implement floating point types (float, double). They're harder -// than the others, so I'll get around to them later >.> + // Format for plUUID + PL_FORMAT_TYPE(const class plUUID &) -// 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) +// ================================== +// 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