@ -166,8 +166,23 @@ public:
ValidateHeader ( ) ;
}
void PushImpl ( s8 value ) ;
void PushImpl ( s16 value ) ;
void PushImpl ( s32 value ) ;
void PushImpl ( s64 value ) ;
void PushImpl ( u8 value ) ;
void PushImpl ( u16 value ) ;
void PushImpl ( u32 value ) ;
void PushImpl ( u64 value ) ;
void PushImpl ( float value ) ;
void PushImpl ( double value ) ;
void PushImpl ( bool value ) ;
void PushImpl ( ResultCode value ) ;
template < typename T >
void Push ( T value ) ;
void Push ( T value ) {
return PushImpl ( value ) ;
}
template < typename First , typename . . . Other >
void Push ( const First & first_value , const Other & . . . other_values ) ;
@ -215,13 +230,11 @@ private:
/// Push ///
template < >
inline void ResponseBuilder : : Push ( s32 value ) {
inline void ResponseBuilder : : PushImpl ( s32 value ) {
cmdbuf [ index + + ] = static_cast < u32 > ( value ) ;
}
template < >
inline void ResponseBuilder : : Push ( u32 value ) {
inline void ResponseBuilder : : PushImpl ( u32 value ) {
cmdbuf [ index + + ] = value ;
}
@ -233,62 +246,52 @@ void ResponseBuilder::PushRaw(const T& value) {
index + = ( sizeof ( T ) + 3 ) / 4 ; // round up to word length
}
template < >
inline void ResponseBuilder : : Push ( ResultCode value ) {
inline void ResponseBuilder : : PushImpl ( ResultCode value ) {
// Result codes are actually 64-bit in the IPC buffer, but only the high part is discarded.
Push ( value . raw ) ;
Push < u32 > ( 0 ) ;
}
template < >
inline void ResponseBuilder : : Push ( s8 value ) {
inline void ResponseBuilder : : PushImpl ( s8 value ) {
PushRaw ( value ) ;
}
template < >
inline void ResponseBuilder : : Push ( s16 value ) {
inline void ResponseBuilder : : PushImpl ( s16 value ) {
PushRaw ( value ) ;
}
template < >
inline void ResponseBuilder : : Push ( s64 value ) {
Push ( static_cast < u32 > ( value ) ) ;
Push ( static_cast < u32 > ( value > > 32 ) ) ;
inline void ResponseBuilder : : PushImpl ( s64 value ) {
PushImpl ( static_cast < u32 > ( value ) ) ;
PushImpl ( static_cast < u32 > ( value > > 32 ) ) ;
}
template < >
inline void ResponseBuilder : : Push ( u8 value ) {
inline void ResponseBuilder : : PushImpl ( u8 value ) {
PushRaw ( value ) ;
}
template < >
inline void ResponseBuilder : : Push ( u16 value ) {
inline void ResponseBuilder : : PushImpl ( u16 value ) {
PushRaw ( value ) ;
}
template < >
inline void ResponseBuilder : : Push ( u64 value ) {
Push ( static_cast < u32 > ( value ) ) ;
Push ( static_cast < u32 > ( value > > 32 ) ) ;
inline void ResponseBuilder : : PushImpl ( u64 value ) {
PushImpl ( static_cast < u32 > ( value ) ) ;
PushImpl ( static_cast < u32 > ( value > > 32 ) ) ;
}
template < >
inline void ResponseBuilder : : Push ( float value ) {
inline void ResponseBuilder : : PushImpl ( float value ) {
u32 integral ;
std : : memcpy ( & integral , & value , sizeof ( u32 ) ) ;
Push ( integral ) ;
Push Impl ( integral ) ;
}
template < >
inline void ResponseBuilder : : Push ( double value ) {
inline void ResponseBuilder : : PushImpl ( double value ) {
u64 integral ;
std : : memcpy ( & integral , & value , sizeof ( u64 ) ) ;
Push ( integral ) ;
Push Impl ( integral ) ;
}
template < >
inline void ResponseBuilder : : Push ( bool value ) {
Push ( static_cast < u8 > ( value ) ) ;
inline void ResponseBuilder : : PushImpl ( bool value ) {
PushImpl ( static_cast < u8 > ( value ) ) ;
}
template < typename First , typename . . . Other >