@ -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 & )
// 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
// Formats for plUoi d
PL_FORMAT_TYPE ( const std : : string & )
PL_FORMAT_TYPE ( const class plLocation & )
PL_FORMAT_TYPE ( const std : : wstring & )
PL_FORMAT_TYPE ( const class plUoid & )
// TODO: Implement floating point types (float, double). They're harder
// Format for plUUID
// than the others, so I'll get around to them later >.>
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...
// END: Formattable type declarations
PL_FORMAT_TYPE ( bool )
// ==================================
// 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