Browse Source

Fix it for standards-complient compilers (GCC/Clang).

Unfortunately, this means that all formatters must be declared in the
same place now, as they must be declared BEFORE the template which uses
them is declared (not just before it was instantiated, which MSVC allows).
Michael Hansen 10 years ago
parent
commit
d8c3769143
  1. 4
      Sources/Plasma/CoreLib/plFileSystem.h
  2. 116
      Sources/Plasma/CoreLib/plFormat.h
  3. 4
      Sources/Plasma/NucleusLib/pnKeyedObject/plUoid.h
  4. 2
      Sources/Plasma/NucleusLib/pnUUID/pnUUID.h

4
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
*/

116
Sources/Plasma/CoreLib/plFormat.h

@ -132,30 +132,11 @@ namespace plFormat_Private
};
extern FormatSpec _FetchNextFormat(_IFormatDataObject &data);
template <typename _Type, typename... _Args>
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 <typename _Type, typename... _Args>
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 <typename _Type, typename... _Args>
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 <typename _Type, typename... _Args>
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

4
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

2
Sources/Plasma/NucleusLib/pnUUID/pnUUID.h

@ -96,6 +96,4 @@ public:
static plUUID Generate();
};
PL_FORMAT_TYPE(const plUUID &)
#endif // pnUUID_h_inc

Loading…
Cancel
Save