diff --git a/src/libCom/osi/os/VMS/osdWireFormat.h b/src/libCom/osi/os/VMS/osdWireFormat.h index a6465085e..2bf036355 100644 --- a/src/libCom/osi/os/VMS/osdWireFormat.h +++ b/src/libCom/osi/os/VMS/osdWireFormat.h @@ -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 ); diff --git a/src/libCom/osi/os/default/osdWireFormat.h b/src/libCom/osi/os/default/osdWireFormat.h index f2b739c46..000c0e821 100644 --- a/src/libCom/osi/os/default/osdWireFormat.h +++ b/src/libCom/osi/os/default/osdWireFormat.h @@ -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 diff --git a/src/libCom/osi/osiWireFormat.h b/src/libCom/osi/osiWireFormat.h index 800e238ee..8fa1611e9 100644 --- a/src/libCom/osi/osiWireFormat.h +++ b/src/libCom/osi/osiWireFormat.h @@ -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 ) {