26#ifndef CASA_LECANONICALCONVERSION_H
27#define CASA_LECANONICALCONVERSION_H
30#include <casacore/casa/aips.h>
31#include <casacore/casa/OS/Conversion.h>
40#define SIZE_LECAN_CHAR 1
41#define SIZE_LECAN_UCHAR 1
42#define SIZE_LECAN_SHORT 2
43#define SIZE_LECAN_USHORT 2
44#define SIZE_LECAN_INT 4
45#define SIZE_LECAN_UINT 4
46#define SIZE_LECAN_INT64 8
47#define SIZE_LECAN_UINT64 8
48#define SIZE_LECAN_FLOAT 4
49#define SIZE_LECAN_DOUBLE 8
64#define CONVERT_LECAN_CHAR 0
65#define CONVERT_LECAN_UCHAR 0
67#if !defined(AIPS_LITTLE_ENDIAN)
68# define CONVERT_LECAN_SHORT 1
69# define CONVERT_LECAN_USHORT 1
70# define CONVERT_LECAN_INT 1
71# define CONVERT_LECAN_UINT 1
72# define CONVERT_LECAN_INT64 1
73# define CONVERT_LECAN_UINT64 1
74# define CONVERT_LECAN_FLOAT 1
75# define CONVERT_LECAN_DOUBLE 1
81# define CONVERT_LECAN_SHORT 0
82# define CONVERT_LECAN_USHORT 0
83# define CONVERT_LECAN_INT 0
84# define CONVERT_LECAN_UINT 0
85# define CONVERT_LECAN_INT64 0
86# define CONVERT_LECAN_UINT64 0
87# define CONVERT_LECAN_FLOAT 0
88# define CONVERT_LECAN_DOUBLE 0
164 static size_t toLocal (
char& to,
const void* from);
165 static size_t toLocal (
unsigned char& to,
const void* from);
166 static size_t toLocal (
short& to,
const void* from);
167 static size_t toLocal (
unsigned short& to,
const void* from);
168 static size_t toLocal (
int& to,
const void* from);
169 static size_t toLocal (
unsigned int& to,
const void* from);
172 static size_t toLocal (
float& to,
const void* from);
173 static size_t toLocal (
double& to,
const void* from);
179 static size_t fromLocal (
void* to,
const char& from);
180 static size_t fromLocal (
void* to,
const unsigned char& from);
181 static size_t fromLocal (
void* to,
const short& from);
182 static size_t fromLocal (
void* to,
const unsigned short& from);
183 static size_t fromLocal (
void* to,
const int& from);
184 static size_t fromLocal (
void* to,
const unsigned int& from);
187 static size_t fromLocal (
void* to,
const float& from);
188 static size_t fromLocal (
void* to,
const double& from);
194 static size_t toLocal (
char* to,
const void* from,
196 static size_t toLocal (
unsigned char* to,
const void* from,
198 static size_t toLocal (
short* to,
const void* from,
200 static size_t toLocal (
unsigned short* to,
const void* from,
202 static size_t toLocal (
int* to,
const void* from,
204 static size_t toLocal (
unsigned int* to,
const void* from,
210 static size_t toLocal (
float* to,
const void* from,
212 static size_t toLocal (
double* to,
const void* from,
219 static size_t fromLocal (
void* to,
const char* from,
221 static size_t fromLocal (
void* to,
const unsigned char* from,
223 static size_t fromLocal (
void* to,
const short* from,
225 static size_t fromLocal (
void* to,
const unsigned short* from,
227 static size_t fromLocal (
void* to,
const int* from,
229 static size_t fromLocal (
void* to,
const unsigned int* from,
235 static size_t fromLocal (
void* to,
const float* from,
237 static size_t fromLocal (
void* to,
const double* from,
415 static void reverse2 (
void* to,
const void* from);
418 static void reverse4 (
void* to,
const void* from);
421 static void reverse8 (
void* to,
const void* from);
424 static void move2 (
void* to,
const void* from);
427 static void move4 (
void* to,
const void* from);
430 static void move8 (
void* to,
const void* from);
441 unsigned short x, xsw;
443 xsw = ((x & 0xffu) << 8u) | (x >> 8u);
451#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
452 xsw = __builtin_bswap32(x);
454 xsw = ((x & 0xffu) << 24u) | ((x & 0xff00u) << 8u) |
455 ((x & 0xff0000u) >> 8u) | (x >> 24u);
464#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
465 xsw = __builtin_bswap64(x);
467 xsw = ((x & 0xffULL) << 56ULL) |
468 ((x & 0xff00ULL) << 40ULL) |
469 ((x & 0xff0000ULL) << 24ULL) |
470 ((x & 0xff000000ULL) << 8ULL) |
471 ((x & 0xff00000000ULL) >> 8ULL) |
472 ((x & 0xff0000000000ULL) >> 24ULL) |
473 ((x & 0xff000000000000ULL) >> 40ULL) |
492 if (
sizeof(to) < 8) {
493 memmove(to, from, 8);
512 to = *(
unsigned char*)from;
519 if (
sizeof(
short) != 2) {
520 if (((
signed char*)from)[0] < 0) {
526#if !defined(AIPS_LITTLE_ENDIAN)
529 move2 (((
char*)&to)+
sizeof(
short)-2, from);
537 if (
sizeof(
unsigned short) != 2) {
540#if !defined(AIPS_LITTLE_ENDIAN)
543 move2 (((
char*)&to)+
sizeof(
unsigned short)-2, from);
551 if (
sizeof(
int) != 4) {
552 if (((
signed char*)from)[0] < 0) {
558#if !defined(AIPS_LITTLE_ENDIAN)
561 move4 (((
char*)&to)+
sizeof(
int)-4, from);
569 if (
sizeof(
unsigned int) != 4) {
572#if !defined(AIPS_LITTLE_ENDIAN)
575 move4 (((
char*)&to)+
sizeof(
unsigned int)-4, from);
583 if (
sizeof(
Int64) != 8) {
584 if (((
signed char*)from)[0] < 0) {
590#if !defined(AIPS_LITTLE_ENDIAN)
601 if (
sizeof(
uInt64) != 8) {
604#if !defined(AIPS_LITTLE_ENDIAN)
615#if !defined(AIPS_LITTLE_ENDIAN)
616 reverse4 (((
char*)&to)+
sizeof(
float)-4, from);
626#if !defined(AIPS_LITTLE_ENDIAN)
627 reverse8 (((
char*)&to)+
sizeof(
double)-8, from);
642 const unsigned char& from)
644 *(
unsigned char*)to = from;
651#if !defined(AIPS_LITTLE_ENDIAN)
654 move2 (to, ((
char*)&from)+
sizeof(
short)-2);
660 const unsigned short& from)
662#if !defined(AIPS_LITTLE_ENDIAN)
665 move2 (to, ((
char*)&from)+
sizeof(
unsigned short)-2);
673#if !defined(AIPS_LITTLE_ENDIAN)
676 move4 (to, ((
char*)&from)+
sizeof(
int)-4);
682 const unsigned int& from)
684#if !defined(AIPS_LITTLE_ENDIAN)
687 move4 (to, ((
char*)&from)+
sizeof(
unsigned int)-4);
695#if !defined(AIPS_LITTLE_ENDIAN)
706#if !defined(AIPS_LITTLE_ENDIAN)
717#if !defined(AIPS_LITTLE_ENDIAN)
728#if !defined(AIPS_LITTLE_ENDIAN)
805 const unsigned char* from,
817 const unsigned short* from,
829 const unsigned int* from,
866 (
const unsigned char*)
876 (
const unsigned short*)
886 (
const unsigned int*)
917 (
const unsigned char*)
927 (
const unsigned short*)
937 (
const unsigned int*)
#define SIZE_LECAN_UINT64
#define SIZE_LECAN_DOUBLE
#define SIZE_LECAN_CHAR
Define the little endian canonical sizes of the built-in data types.
#define SIZE_LECAN_USHORT
size_t ValueFunction(void *to, const void *from, size_t nvalues)
Define the signature of a function converting nvalues values from internal to external format or vice...
void * ByteFunction(void *to, const void *from, size_t nbytes)
Define the signature of a function converting from one format to another providing the number of byte...
static void reverse2(void *to, const void *from)
Reverse 2 bytes.
static Conversion::ByteFunction * getByteFromLocal(const unsigned int *)
static void * byteFromLocalUInt64(void *to, const void *from, size_t nrbytes)
static size_t toLocalDouble(void *to, const void *from, size_t nr)
static size_t fromLocalUInt(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteToLocal(const uInt64 *)
static size_t toLocalChar(void *to, const void *from, size_t nr)
Convert nr values from canonical format to local format.
static void move2(void *to, const void *from)
Move 2 bytes.
LECanonicalConversion()
This class should not be constructed (so declare the constructor private).
static void * byteToLocalUChar(void *to, const void *from, size_t nrbytes)
static void * byteFromLocalInt64(void *to, const void *from, size_t nrbytes)
static size_t fromLocalChar(void *to, const void *from, size_t nr)
Convert nr values from local format to canonical format.
static void move8(void *to, const void *from)
Move 8 bytes.
static void reverse8(void *to, const void *from)
Reverse 8 bytes.
static void * byteToLocalChar(void *to, const void *from, size_t nrbytes)
Convert values from canonical format to local format.
static void * byteFromLocalFloat(void *to, const void *from, size_t nrbytes)
static Conversion::ByteFunction * getByteFromLocal(const unsigned short *)
static Conversion::ByteFunction * getByteToLocal(const short *)
static void * byteToLocalShort(void *to, const void *from, size_t nrbytes)
static void * byteFromLocalShort(void *to, const void *from, size_t nrbytes)
static void * byteToLocalFloat(void *to, const void *from, size_t nrbytes)
static size_t fromLocalShort(void *to, const void *from, size_t nr)
static size_t toLocalInt(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteFromLocal(const int *)
static size_t fromLocalDouble(void *to, const void *from, size_t nr)
static size_t fromLocalUChar(void *to, const void *from, size_t nr)
static void * byteFromLocalChar(void *to, const void *from, size_t nrbytes)
Convert values from local format to canonical format.
static Conversion::ByteFunction * getByteToLocal(const unsigned char *)
static size_t toLocalFloat(void *to, const void *from, size_t nr)
static size_t toLocalInt64(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteFromLocal(const uInt64 *)
static Conversion::ByteFunction * getByteFromLocal(const char *)
static Conversion::ByteFunction * getByteToLocal(const unsigned int *)
static size_t fromLocalInt64(void *to, const void *from, size_t nr)
static size_t toLocalUShort(void *to, const void *from, size_t nr)
static void * byteToLocalDouble(void *to, const void *from, size_t nrbytes)
static size_t fromLocalInt(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteFromLocal(const short *)
static void * byteToLocalUShort(void *to, const void *from, size_t nrbytes)
static Conversion::ByteFunction * getByteToLocal(const int *)
static size_t toLocal(char &to, const void *from)
Convert one value from canonical format to local format.
static Conversion::ByteFunction * getByteToLocal(const double *)
static void * byteToLocalInt64(void *to, const void *from, size_t nrbytes)
static unsigned int canonicalSize(const char *)
Return the canonical length for the various data types.
static Conversion::ByteFunction * getByteToLocal(const unsigned short *)
static void move4(void *to, const void *from)
Move 4 bytes.
static void * byteFromLocalDouble(void *to, const void *from, size_t nrbytes)
static void * byteToLocalUInt64(void *to, const void *from, size_t nrbytes)
static size_t toLocalShort(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteFromLocal(const float *)
static void * byteToLocalInt(void *to, const void *from, size_t nrbytes)
static void reverse4(void *to, const void *from)
Reverse 4 bytes.
static void * byteToLocalUInt(void *to, const void *from, size_t nrbytes)
static Conversion::ValueFunction * getFromLocal(const char *)
static size_t fromLocal(void *to, const char &from)
Convert one value from local format to canonical format.
static Conversion::ByteFunction * getByteToLocal(const char *)
Get the byte conversion function for the given type.
static size_t toLocalUInt64(void *to, const void *from, size_t nr)
static size_t fromLocalUInt64(void *to, const void *from, size_t nr)
static size_t fromLocalUShort(void *to, const void *from, size_t nr)
static size_t toLocalUInt(void *to, const void *from, size_t nr)
static void * byteFromLocalUChar(void *to, const void *from, size_t nrbytes)
static void * byteFromLocalInt(void *to, const void *from, size_t nrbytes)
static Conversion::ByteFunction * getByteToLocal(const Int64 *)
static Conversion::ValueFunction * getToLocal(const char *)
Get the value conversion function for the given type.
static void * byteFromLocalUInt(void *to, const void *from, size_t nrbytes)
static Conversion::ByteFunction * getByteFromLocal(const unsigned char *)
static void * byteFromLocalUShort(void *to, const void *from, size_t nrbytes)
static Conversion::ByteFunction * getByteToLocal(const float *)
static size_t toLocalUChar(void *to, const void *from, size_t nr)
static size_t fromLocalFloat(void *to, const void *from, size_t nr)
static Conversion::ByteFunction * getByteFromLocal(const double *)
static Conversion::ByteFunction * getByteFromLocal(const Int64 *)
this file contains all the compiler specific defines
long long Int64
Define the extra non-standard types used by Casacore (like proposed uSize, Size)
unsigned long long uInt64