@ -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,6 +174,10 @@ plString plFormat(const char *fmt_str, _Type value, _Args... args)
# define PL_FORMAT_FORWARD(format, fwd_value) \
_impl_plFormat_DataHandler ( ( format ) , ( fwd_value ) )
// ====================================
// BEGIN: Formattable type declarations
// ====================================
PL_FORMAT_TYPE ( char )
PL_FORMAT_TYPE ( wchar_t )
PL_FORMAT_TYPE ( signed char )
@ -211,6 +196,9 @@ 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 & )
@ -222,4 +210,44 @@ PL_FORMAT_TYPE(const std::wstring &)
// 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