use function template specialization instead of function overloading
hoping to workaround issues with gcc 4.0
This commit is contained in:
@@ -23,12 +23,16 @@
|
||||
#define EPICS_LITTLE_ENDIAN
|
||||
#define EPICS_CONVERSION_REQUIRED
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsFloat32 & dst )
|
||||
template <>
|
||||
inline void WireGet < epicsFloat32 > (
|
||||
const epicsUInt8 * pWireSrc, epicsFloat32 & dst )
|
||||
{
|
||||
cvt$convert_float ( pWireSrc, CVT$K_IEEE_S, & dst, CVT$K_VAX_F, CVT$M_BIG_ENDIAN );
|
||||
}
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void WireGet < epicsFloat64 > (
|
||||
const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
{
|
||||
# if defined ( __G_FLOAT ) && ( __G_FLOAT == 1 )
|
||||
cvt$convert_float ( pWireSrc, CVT$K_IEEE_T, & dst, CVT$K_VAX_G, CVT$M_BIG_ENDIAN );
|
||||
@@ -37,17 +41,22 @@ inline void WireGet ( const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsOldString & dst )
|
||||
inline void WireGet (
|
||||
const epicsUInt8 * pWireSrc, epicsOldString & dst )
|
||||
{
|
||||
memcpy ( & dst, pWireSrc, sizeof ( dst ) );
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsFloat32 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireSet < epicsFloat32 > (
|
||||
const epicsFloat32 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
cvt$convert_float ( & src, CVT$K_VAX_F , pWireDst, CVT$K_IEEE_S, CVT$M_BIG_ENDIAN );
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireSet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
# if defined ( __G_FLOAT ) && ( __G_FLOAT == 1 )
|
||||
cvt$convert_float ( & src, CVT$K_VAX_G , pWireDst, CVT$K_IEEE_T, CVT$M_BIG_ENDIAN );
|
||||
@@ -56,27 +65,36 @@ inline void WireSet ( const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsOldString & src, epicsUInt8 * pWireDst )
|
||||
inline void WireSet (
|
||||
const epicsOldString & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
memcpy ( pWireDst, & src, sizeof ( src ) );
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsUInt16 > (
|
||||
const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
{
|
||||
dst = byteSwap ( src );
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsUInt32 > (
|
||||
const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
{
|
||||
dst = byteSwap ( src );
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsFloat32 & src, epicsFloat32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsFloat32 > (
|
||||
const epicsFloat32 & src, epicsFloat32 & dst )
|
||||
{
|
||||
cvt$convert_float ( & src, CVT$K_IEEE_S, & dst, CVT$K_VAX_F, CVT$M_BIG_ENDIAN );
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
{
|
||||
# if defined ( __G_FLOAT ) && ( __G_FLOAT == 1 )
|
||||
cvt$convert_float ( & src, CVT$K_IEEE_T, & dst, CVT$K_VAX_G, CVT$M_BIG_ENDIAN );
|
||||
@@ -85,22 +103,30 @@ inline void AlignedWireGet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsUInt16 > (
|
||||
const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
{
|
||||
dst = byteSwap ( src );
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsUInt32 > (
|
||||
const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
{
|
||||
dst = byteSwap ( src );
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsFloat32 & src, epicsFloat32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsFloat32 > (
|
||||
const epicsFloat32 & src, epicsFloat32 & dst )
|
||||
{
|
||||
cvt$convert_float ( & src, CVT$K_VAX_F , & dst, CVT$K_IEEE_S, CVT$M_BIG_ENDIAN );
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
{
|
||||
# if defined ( __G_FLOAT ) && ( __G_FLOAT == 1 )
|
||||
cvt$convert_float ( & src, CVT$K_VAX_G , & dst, CVT$K_IEEE_T, CVT$M_BIG_ENDIAN );
|
||||
|
||||
@@ -95,7 +95,9 @@
|
||||
// but inconsistent with the vast majority of CPUs
|
||||
//
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void WireGet < epicsFloat64 > (
|
||||
const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
{
|
||||
// copy through union here
|
||||
// a) prevents over-aggresive optimization under strict aliasing rules
|
||||
@@ -116,12 +118,15 @@ inline void WireGet ( const epicsUInt8 * pWireSrc, epicsFloat64 & dst )
|
||||
dst = tmp._f;
|
||||
}
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsOldString & dst )
|
||||
inline void WireGet (
|
||||
const epicsUInt8 * pWireSrc, epicsOldString & dst )
|
||||
{
|
||||
memcpy ( & dst, pWireSrc, sizeof ( dst ) );
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireSet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
// copy through union here
|
||||
// a) prevents over-aggresive optimization under strict aliasing rules
|
||||
@@ -142,12 +147,15 @@ inline void WireSet ( const epicsFloat64 & src, epicsUInt8 * pWireDst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsOldString & src, epicsUInt8 * pWireDst )
|
||||
inline void WireSet (
|
||||
const epicsOldString & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
memcpy ( pWireDst, & src, sizeof ( src ) );
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsUInt16 > (
|
||||
const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
{
|
||||
# if defined ( EPICS_LITTLE_ENDIAN )
|
||||
dst = byteSwap ( src );
|
||||
@@ -158,7 +166,9 @@ inline void AlignedWireGet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsUInt32 > (
|
||||
const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
{
|
||||
# if defined ( EPICS_LITTLE_ENDIAN )
|
||||
dst = byteSwap ( src );
|
||||
@@ -169,7 +179,9 @@ inline void AlignedWireGet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireGet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void AlignedWireGet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
{
|
||||
// copy through union here
|
||||
// a) prevents over-aggresive optimization under strict aliasing rules
|
||||
@@ -197,7 +209,9 @@ inline void AlignedWireGet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsUInt16 >
|
||||
( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
{
|
||||
# if defined ( EPICS_LITTLE_ENDIAN )
|
||||
dst = byteSwap ( src );
|
||||
@@ -208,7 +222,9 @@ inline void AlignedWireSet ( const epicsUInt16 & src, epicsUInt16 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsUInt32 > (
|
||||
const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
{
|
||||
# if defined ( EPICS_LITTLE_ENDIAN )
|
||||
dst = byteSwap ( src );
|
||||
@@ -219,7 +235,9 @@ inline void AlignedWireSet ( const epicsUInt32 & src, epicsUInt32 & dst )
|
||||
# endif
|
||||
}
|
||||
|
||||
inline void AlignedWireSet ( const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
template <>
|
||||
inline void AlignedWireSet < epicsFloat64 > (
|
||||
const epicsFloat64 & src, epicsFloat64 & dst )
|
||||
{
|
||||
// copy through union here
|
||||
// a) prevents over-aggresive optimization under strict aliasing rules
|
||||
|
||||
@@ -159,27 +159,6 @@ union WireAlias < epicsFloat32 > {
|
||||
// over-aggresive optimization under strict aliasing rules.
|
||||
//
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsUInt8 & dst )
|
||||
{
|
||||
dst = pWireSrc[0];
|
||||
}
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsUInt16 & dst )
|
||||
{
|
||||
dst =
|
||||
( static_cast < epicsUInt16 > ( pWireSrc[0] ) << 8u ) |
|
||||
static_cast < epicsUInt16 > ( pWireSrc[1] );
|
||||
}
|
||||
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, epicsUInt32 & dst )
|
||||
{
|
||||
dst =
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[0] ) << 24u ) |
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[1] ) << 16u ) |
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[2] ) << 8u ) |
|
||||
static_cast < epicsUInt32 > ( pWireSrc[3] );
|
||||
}
|
||||
|
||||
template < class T >
|
||||
inline void WireGet ( const epicsUInt8 * pWireSrc, T & dst )
|
||||
{
|
||||
@@ -191,23 +170,31 @@ inline void WireGet ( const epicsUInt8 * pWireSrc, T & dst )
|
||||
dst = tmp._o;
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsUInt8 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireGet < epicsUInt8 > (
|
||||
const epicsUInt8 * pWireSrc, epicsUInt8 & dst )
|
||||
{
|
||||
pWireDst[0] = src;
|
||||
dst = pWireSrc[0];
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsUInt16 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireGet < epicsUInt16 > (
|
||||
const epicsUInt8 * pWireSrc, epicsUInt16 & dst )
|
||||
{
|
||||
pWireDst[0] = static_cast < epicsUInt8 > ( src >> 8u );
|
||||
pWireDst[1] = static_cast < epicsUInt8 > ( src );
|
||||
dst =
|
||||
( static_cast < epicsUInt16 > ( pWireSrc[0] ) << 8u ) |
|
||||
static_cast < epicsUInt16 > ( pWireSrc[1] );
|
||||
}
|
||||
|
||||
inline void WireSet ( const epicsUInt32 & src, epicsUInt8 * pWireDst )
|
||||
template <>
|
||||
inline void WireGet < epicsUInt32 > (
|
||||
const epicsUInt8 * pWireSrc, epicsUInt32 & dst )
|
||||
{
|
||||
pWireDst[0] = static_cast < epicsUInt8 > ( src >> 24u );
|
||||
pWireDst[1] = static_cast < epicsUInt8 > ( src >> 16u );
|
||||
pWireDst[2] = static_cast < epicsUInt8 > ( src >> 8u );
|
||||
pWireDst[3] = static_cast < epicsUInt8 > ( src );
|
||||
dst =
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[0] ) << 24u ) |
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[1] ) << 16u ) |
|
||||
( static_cast < epicsUInt32 > ( pWireSrc[2] ) << 8u ) |
|
||||
static_cast < epicsUInt32 > ( pWireSrc[3] );
|
||||
}
|
||||
|
||||
template < class T >
|
||||
@@ -221,6 +208,31 @@ inline void WireSet ( const T & src, epicsUInt8 * pWireDst )
|
||||
WireSet ( tmp._u, pWireDst );
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void WireSet < epicsUInt8 > (
|
||||
const epicsUInt8 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
pWireDst[0] = src;
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void WireSet < epicsUInt16 > (
|
||||
const epicsUInt16 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
pWireDst[0] = static_cast < epicsUInt8 > ( src >> 8u );
|
||||
pWireDst[1] = static_cast < epicsUInt8 > ( src );
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void WireSet < epicsUInt32 > (
|
||||
const epicsUInt32 & src, epicsUInt8 * pWireDst )
|
||||
{
|
||||
pWireDst[0] = static_cast < epicsUInt8 > ( src >> 24u );
|
||||
pWireDst[1] = static_cast < epicsUInt8 > ( src >> 16u );
|
||||
pWireDst[2] = static_cast < epicsUInt8 > ( src >> 8u );
|
||||
pWireDst[3] = static_cast < epicsUInt8 > ( src );
|
||||
}
|
||||
|
||||
template < class T >
|
||||
inline void AlignedWireGet ( const T & src, T & dst )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user