mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-18 11:19:10 +00:00
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).
This commit is contained in:
@ -227,10 +227,6 @@ inline plFileName operator+(const char *left, const plFileName &right)
|
|||||||
{ return left + right.AsString(); }
|
{ return left + right.AsString(); }
|
||||||
|
|
||||||
|
|
||||||
// Shortcut for use in plFormat
|
|
||||||
PL_FORMAT_TYPE(const plFileName &)
|
|
||||||
|
|
||||||
|
|
||||||
/** Structure to get information about a file by name.
|
/** Structure to get information about a file by name.
|
||||||
* \sa plFileName
|
* \sa plFileName
|
||||||
*/
|
*/
|
||||||
|
@ -132,30 +132,11 @@ namespace plFormat_Private
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern FormatSpec _FetchNextFormat(_IFormatDataObject &data);
|
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`.
|
/** 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()
|
* \sa PL_FORMAT_IMPL()
|
||||||
*/
|
*/
|
||||||
#define PL_FORMAT_TYPE(_type) \
|
#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) \
|
#define PL_FORMAT_FORWARD(format, fwd_value) \
|
||||||
_impl_plFormat_DataHandler((format), (fwd_value))
|
_impl_plFormat_DataHandler((format), (fwd_value))
|
||||||
|
|
||||||
PL_FORMAT_TYPE(char)
|
// ====================================
|
||||||
PL_FORMAT_TYPE(wchar_t)
|
// BEGIN: Formattable type declarations
|
||||||
PL_FORMAT_TYPE(signed char)
|
// ====================================
|
||||||
PL_FORMAT_TYPE(unsigned char)
|
|
||||||
PL_FORMAT_TYPE(short)
|
PL_FORMAT_TYPE(char)
|
||||||
PL_FORMAT_TYPE(unsigned short)
|
PL_FORMAT_TYPE(wchar_t)
|
||||||
PL_FORMAT_TYPE(int)
|
PL_FORMAT_TYPE(signed char)
|
||||||
PL_FORMAT_TYPE(unsigned)
|
PL_FORMAT_TYPE(unsigned char)
|
||||||
PL_FORMAT_TYPE(long)
|
PL_FORMAT_TYPE(short)
|
||||||
PL_FORMAT_TYPE(unsigned long)
|
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)
|
#if (SIZEOF_LONG == 4)
|
||||||
PL_FORMAT_TYPE(int64_t)
|
PL_FORMAT_TYPE(int64_t)
|
||||||
PL_FORMAT_TYPE(uint64_t)
|
PL_FORMAT_TYPE(uint64_t)
|
||||||
#endif
|
#endif
|
||||||
PL_FORMAT_TYPE(const char *)
|
PL_FORMAT_TYPE(const char *)
|
||||||
PL_FORMAT_TYPE(const wchar_t *)
|
PL_FORMAT_TYPE(const wchar_t *)
|
||||||
PL_FORMAT_TYPE(const plString &)
|
PL_FORMAT_TYPE(const plString &)
|
||||||
|
|
||||||
// TODO: Remove these when they're no longer needed
|
// Shortcut for plFileName
|
||||||
PL_FORMAT_TYPE(const std::string &)
|
PL_FORMAT_TYPE(const class plFileName &)
|
||||||
PL_FORMAT_TYPE(const std::wstring &)
|
|
||||||
|
|
||||||
// TODO: Implement floating point types (float, double). They're harder
|
// TODO: Remove these when they're no longer needed
|
||||||
// than the others, so I'll get around to them later >.>
|
PL_FORMAT_TYPE(const std::string &)
|
||||||
|
PL_FORMAT_TYPE(const std::wstring &)
|
||||||
|
|
||||||
// Formats as "true" or "false", following normal string formatting rules.
|
// TODO: Implement floating point types (float, double). They're harder
|
||||||
// To use other formats, don't pass us a bool directly...
|
// than the others, so I'll get around to them later >.>
|
||||||
PL_FORMAT_TYPE(bool)
|
|
||||||
|
// 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 <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
|
#endif // plFormat_Defined
|
||||||
|
@ -144,8 +144,6 @@ public:
|
|||||||
static const plLocation kInvalidLoc;
|
static const plLocation kInvalidLoc;
|
||||||
};
|
};
|
||||||
|
|
||||||
PL_FORMAT_TYPE(const plLocation &)
|
|
||||||
|
|
||||||
//// plUoid //////////////////////////////////////////////////////////////////
|
//// plUoid //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class plUoid
|
class plUoid
|
||||||
@ -200,6 +198,4 @@ protected:
|
|||||||
plLoadMask fLoadMask;
|
plLoadMask fLoadMask;
|
||||||
};
|
};
|
||||||
|
|
||||||
PL_FORMAT_TYPE(const plUoid &)
|
|
||||||
|
|
||||||
#endif // plUoid_h_inc
|
#endif // plUoid_h_inc
|
||||||
|
@ -96,6 +96,4 @@ public:
|
|||||||
static plUUID Generate();
|
static plUUID Generate();
|
||||||
};
|
};
|
||||||
|
|
||||||
PL_FORMAT_TYPE(const plUUID &)
|
|
||||||
|
|
||||||
#endif // pnUUID_h_inc
|
#endif // pnUUID_h_inc
|
||||||
|
Reference in New Issue
Block a user