casacore
ModcompConversion.h
Go to the documentation of this file.
1//# ModCompConversion.h: A class with static functions to convert ModComp format
2//# Copyright (C) 1998,1999,2001
3//# Associated Universities, Inc. Washington DC, USA.
4//#
5//# This library is free software; you can redistribute it and/or modify it
6//# under the terms of the GNU Library General Public License as published by
7//# the Free Software Foundation; either version 2 of the License, or (at your
8//# option) any later version.
9//#
10//# This library is distributed in the hope that it will be useful, but WITHOUT
11//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13//# License for more details.
14//#
15//# You should have received a copy of the GNU Library General Public License
16//# along with this library; if not, write to the Free Software Foundation,
17//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18//#
19//# Correspondence concerning AIPS++ should be addressed as follows:
20//# Internet email: aips2-request@nrao.edu.
21//# Postal address: AIPS++ Project Office
22//# National Radio Astronomy Observatory
23//# 520 Edgemont Road
24//# Charlottesville, VA 22903-2475 USA
25//#
26//# $Id$
27
28#ifndef CASA_MODCOMPCONVERSION_H
29#define CASA_MODCOMPCONVERSION_H
30
31#include <casacore/casa/aips.h>
32#include <casacore/casa/Utilities/Assert.h>
33#include <casacore/casa/OS/CanonicalConversion.h>
34
35namespace casacore { //# NAMESPACE CASACORE - BEGIN
36
37// Define the canonical sizes of the built-in data types.
38// These are the same for all machine architectures.
39
40#define SIZE_MODCOMP_CHAR 1
41#define SIZE_MODCOMP_UCHAR 1
42#define SIZE_MODCOMP_SHORT 2
43#define SIZE_MODCOMP_USHORT 2
44#define SIZE_MODCOMP_INT 4
45#define SIZE_MODCOMP_UINT 4
46#define SIZE_MODCOMP_INT64 4
47#define SIZE_MODCOMP_UINT64 4
48#define SIZE_MODCOMP_FLOAT 4
49#define SIZE_MODCOMP_DOUBLE 8
50
51// Define for each data format if a conversion is needed from the ModComp
52// format to the local format (or vice-versa). This allows for optimizations
53// in, for example, AipsIO.
54
55// The ModComp format is ASCII for strings, a proprietary floating point format
56// and 2-complement for integers (all most significant bit first) with the
57// lengths as shown above.
58
59// Change the definitions below if new architectures (whith different lengths
60// for these integer types) are being used.
61#define CONVERT_MODCOMP_CHAR 0
62#define CONVERT_MODCOMP_UCHAR 0
63// Conversion is needed for little endian architectures (like DEC and Intel),
64// because the bytes have to be swapped (thus not for data with length 1).
65#if defined(AIPS_LITTLE_ENDIAN)
66#define CONVERT_MODCOMP_SHORT 1
67#define CONVERT_MODCOMP_USHORT 1
68#define CONVERT_MODCOMP_INT 1
69#define CONVERT_MODCOMP_UINT 1
70#define CONVERT_MODCOMP_INT64 1
71#define CONVERT_MODCOMP_UINT64 1
72#else
73// Conversion is not needed for integers if the local lengths for Shorts and
74// Ints is 2,4 respectively.
75#define CONVERT_MODCOMP_SHORT 0
76#define CONVERT_MODCOMP_USHORT 0
77#define CONVERT_MODCOMP_INT 0
78#define CONVERT_MODCOMP_UINT 0
79#define CONVERT_MODCOMP_INT64 1
80#define CONVERT_MODCOMP_UINT64 1
81#endif
82// Conversion is always needed for floating point data.
83#define CONVERT_MODCOMP_FLOAT 1
84#define CONVERT_MODCOMP_DOUBLE 1
85
86// <summary>Static functions to convert Modcomp numeric formats</summary>
87
88// <use visibility=export>
89
90// <reviewed reviewer="" date="yyyy/mm/dd" tests="tModcompConversion" demos="">
91// </reviewed>
92
93// <synopsis>
94// This class contains static toLocal functions to convert data from Modcomp
95// format to local format and vice-versa.
96//
97// The functions work on both big-endian and little-endian machines. They
98// convert between Modcomp 2-byte integers and Shorts (or uShorts) and Modcomp
99// 4-byte integers and Ints (or uInts, Int64s or uInt64s).
100//
101// It is currently not possible to convert floating point numbers from local
102// format to Modcomp. Attempting to do so will throw an exception (AipsError).
103// </synopsis>
104
105// <motivation>
106// The VLA data is stored using Modcomp numeric data formats and needs to be
107// converted to the local format to be manipulated.
108// </motivation>
109
110// <todo asof="$DATE$">
111// <li> Support conversion of floating point data to Modcomp format
112// <li> Support data type long double.
113// </todo>
114
115
117{
118public:
119 // Convert one value from Modcomp format to local format.
120 // The from and to buffer should not overlap.
121 // <group>
122 static size_t toLocal(Char& to, const void* from);
123 static size_t toLocal(uChar& to, const void* from);
124 static size_t toLocal(Short& to, const void* from);
125 static size_t toLocal(uShort& to, const void* from);
126 static size_t toLocal(Int& to, const void* from);
127 static size_t toLocal(uInt& to, const void* from);
128 static size_t toLocal(Int64& to, const void* from);
129 static size_t toLocal(uInt64& to, const void* from);
130 static size_t toLocal(Float& to, const void* from);
131 static size_t toLocal(Double& to, const void* from);
132 // </group>
133
134 // Convert nr values from Modcomp format to local format.
135 // The from and to buffer should not overlap.
136 // <group>
137 static size_t toLocal(Char* to, const void* from, size_t nr);
138 static size_t toLocal(uChar* to, const void* from, size_t nr);
139 static size_t toLocal(Short* to, const void* from, size_t nr);
140 static size_t toLocal(uShort* to, const void* from, size_t nr);
141 static size_t toLocal(Int* to, const void* from, size_t nr);
142 static size_t toLocal(uInt* to, const void* from, size_t nr);
143 static size_t toLocal(Int64* to, const void* from, size_t nr);
144 static size_t toLocal(uInt64* to, const void* from, size_t nr);
145 static size_t toLocal(Float* to, const void* from, size_t nr);
146 static size_t toLocal(Double* to, const void* from, size_t nr);
147 // </group>
148
149 // Convert one value from local format to Modcomp format. The from and to
150 // buffer should not overlap. The floating point functions will throw
151 // exceptions as they are not implemented yet.
152 // <group>
153 static size_t fromLocal(void* to, Char from);
154 static size_t fromLocal(void* to, uChar from);
155 static size_t fromLocal(void* to, Short from);
156 static size_t fromLocal(void* to, uShort from);
157 static size_t fromLocal(void* to, Int from);
158 static size_t fromLocal(void* to, uInt from);
159 static size_t fromLocal(void* to, Int64 from);
160 static size_t fromLocal(void* to, uInt64 from);
161 static size_t fromLocal(void* to, Float from);
162 static size_t fromLocal(void* to, Double from);
163 // </group>
164
165 // Convert nr values from local format to Modcomp format. The from and to
166 // buffer should not overlap. The floating point functions will throw
167 // exceptions as they are not implemented yet.
168 // <group>
169 static size_t fromLocal(void* to, const Char* from, size_t nr);
170 static size_t fromLocal(void* to, const uChar* from, size_t nr);
171 static size_t fromLocal(void* to, const Short* from, size_t nr);
172 static size_t fromLocal(void* to, const uShort* from, size_t nr);
173 static size_t fromLocal(void* to, const Int* from, size_t nr);
174 static size_t fromLocal(void* to, const uInt* from, size_t nr);
175 static size_t fromLocal(void* to, const Int64* from, size_t nr);
176 static size_t fromLocal(void* to, const uInt64* from, size_t nr);
177 static size_t fromLocal(void* to, const Float* from, size_t nr);
178 static size_t fromLocal(void* to, const Double* from, size_t nr);
179 // </group>
180
181private:
182 // This class should not be constructed
183 // (so declare the constructor private).
185};
186
187inline size_t ModcompConversion::toLocal(Char& to, const void* from) {
188 return CanonicalConversion::toLocal(to, from);
189}
190
191inline size_t ModcompConversion::toLocal(uChar& to, const void* from) {
192 return CanonicalConversion::toLocal(to, from);
193}
194
195inline size_t ModcompConversion::toLocal(Short& to, const void* from) {
196 return CanonicalConversion::toLocal(to, from);
197}
198
199inline size_t ModcompConversion::toLocal(uShort& to, const void* from) {
200 return CanonicalConversion::toLocal(to, from);
201}
202
203inline size_t ModcompConversion::toLocal(Int& to, const void* from) {
204 return CanonicalConversion::toLocal(to, from);
205}
206
207inline size_t ModcompConversion::toLocal(uInt& to, const void* from) {
208 return CanonicalConversion::toLocal(to, from);
209}
210
211inline size_t ModcompConversion::toLocal(Int64& to, const void* from) {
212 Int tmp;
213 size_t res = toLocal (tmp, from);
214 to = tmp;
215 return res;
216}
217
218inline size_t ModcompConversion::toLocal(uInt64& to, const void* from) {
219 uInt tmp;
220 size_t res = toLocal (tmp, from);
221 to = tmp;
222 return res;
223}
224
225inline size_t ModcompConversion::toLocal(Float& to, const void* from) {
226 return ModcompConversion::toLocal(&to, from, 1u);
227}
228
229inline size_t ModcompConversion::toLocal(Double& to, const void* from) {
230 return ModcompConversion::toLocal(&to, from, 1u);
231}
232
233inline size_t ModcompConversion::toLocal(Char* to, const void* from, size_t nr) {
234 return CanonicalConversion::toLocalChar(to, from, nr);
235}
236
237inline size_t ModcompConversion::toLocal(uChar* to, const void* from, size_t nr) {
238 return CanonicalConversion::toLocalUChar(to, from, nr);
239}
240
241inline size_t ModcompConversion::toLocal(Short* to, const void* from, size_t nr) {
242 return CanonicalConversion::toLocalShort(to, from, nr);
243}
244
245inline size_t ModcompConversion::toLocal(uShort* to, const void* from, size_t nr) {
246 return CanonicalConversion::toLocalUShort(to, from, nr);
247}
248
249inline size_t ModcompConversion::toLocal(Int* to, const void* from, size_t nr) {
250 return CanonicalConversion::toLocalInt(to, from, nr);
251}
252
253inline size_t ModcompConversion::toLocal(uInt* to, const void* from, size_t nr) {
254 return CanonicalConversion::toLocalUInt(to, from, nr);
255}
256
257inline size_t ModcompConversion::fromLocal(void* to, Char from) {
258 return CanonicalConversion::fromLocal(to, from);
259}
260
261inline size_t ModcompConversion::fromLocal(void* to, uChar from) {
262 return CanonicalConversion::fromLocal(to, from);
263}
264
265inline size_t ModcompConversion::fromLocal(void* to, Short from) {
266 return CanonicalConversion::fromLocal (to, from);
267}
268
269inline size_t ModcompConversion::fromLocal(void* to, uShort from) {
270 return CanonicalConversion::fromLocal(to, from);
271}
272
273inline size_t ModcompConversion::fromLocal(void* to, Int from) {
274 return CanonicalConversion::fromLocal (to, from);
275}
276
277inline size_t ModcompConversion::fromLocal(void* to, uInt from) {
278 return CanonicalConversion::fromLocal (to, from);
279}
280
281inline size_t ModcompConversion::fromLocal(void* to, Int64 from) {
282 return CanonicalConversion::fromLocal (to, (Int) from);
283}
284
285inline size_t ModcompConversion::fromLocal(void* to, uInt64 from) {
286 return CanonicalConversion::fromLocal (to, (uInt) from);
287}
288
289inline size_t ModcompConversion::fromLocal(void* to, Float from) {
290 return ModcompConversion::fromLocal(to, &from, 1u);
291}
292
293inline size_t ModcompConversion::fromLocal(void* to, Double from) {
294 return ModcompConversion::fromLocal(to, &from, 1u);
295}
296
297inline size_t ModcompConversion::fromLocal(void* to, const Char* from, size_t nr) {
298 return CanonicalConversion::fromLocalChar(to, from, nr);
299}
300
301inline size_t ModcompConversion::fromLocal(void* to, const uChar* from, size_t nr){
302 return CanonicalConversion::fromLocalUChar(to, from, nr);
303}
304
305inline size_t ModcompConversion::fromLocal(void* to, const Short* from, size_t nr){
306 return CanonicalConversion::fromLocalShort(to, from, nr);
307}
308
309inline size_t ModcompConversion::fromLocal(void* to, const uShort* from,size_t nr){
310 return CanonicalConversion::fromLocalUShort(to, from, nr);
311}
312
313inline size_t ModcompConversion::fromLocal(void* to, const Int* from, size_t nr) {
314 return CanonicalConversion::fromLocalInt(to, from, nr);
315}
316
317inline size_t ModcompConversion::fromLocal(void* to, const uInt* from, size_t nr) {
318 return CanonicalConversion::fromLocalUInt(to, from, nr);
319}
320
321
322
323} //# NAMESPACE CASACORE - END
324
325#endif
static size_t toLocalChar(void *to, const void *from, size_t nr)
Convert nr values from canonical format to local format.
static size_t fromLocalChar(void *to, const void *from, size_t nr)
Convert nr values from local format to canonical format.
static size_t fromLocalUShort(void *to, const void *from, size_t nr)
static size_t fromLocalUChar(void *to, const void *from, size_t nr)
static size_t toLocalInt(void *to, const void *from, size_t nr)
static size_t fromLocal(void *to, const char &from)
Convert one value from local format to canonical format.
static size_t toLocal(char &to, const void *from)
Convert one value from canonical format to local format.
static size_t toLocalUChar(void *to, const void *from, size_t nr)
static size_t fromLocalShort(void *to, const void *from, size_t nr)
static size_t toLocalUInt(void *to, const void *from, size_t nr)
static size_t toLocalUShort(void *to, const void *from, size_t nr)
static size_t fromLocalInt(void *to, const void *from, size_t nr)
static size_t toLocalShort(void *to, const void *from, size_t nr)
static size_t fromLocalUInt(void *to, const void *from, size_t nr)
static size_t fromLocal(void *to, Char from)
Convert one value from local format to Modcomp format.
static size_t toLocal(Char &to, const void *from)
Convert one value from Modcomp format to local format.
static size_t fromLocal(void *to, const Int64 *from, size_t nr)
static size_t toLocal(Float *to, const void *from, size_t nr)
static size_t fromLocal(void *to, const Double *from, size_t nr)
ModcompConversion()
This class should not be constructed (so declare the constructor private).
static size_t toLocal(uInt64 *to, const void *from, size_t nr)
static size_t toLocal(Int64 *to, const void *from, size_t nr)
static size_t toLocal(Double *to, const void *from, size_t nr)
static size_t fromLocal(void *to, const Float *from, size_t nr)
static size_t fromLocal(void *to, const uInt64 *from, size_t nr)
this file contains all the compiler specific defines
Definition: mainpage.dox:28
unsigned char uChar
Definition: aipstype.h:47
short Short
Definition: aipstype.h:48
unsigned int uInt
Definition: aipstype.h:51
unsigned short uShort
Definition: aipstype.h:49
long long Int64
Define the extra non-standard types used by Casacore (like proposed uSize, Size)
Definition: aipsxtype.h:38
float Float
Definition: aipstype.h:54
int Int
Definition: aipstype.h:50
double Double
Definition: aipstype.h:55
char Char
Definition: aipstype.h:46
unsigned long long uInt64
Definition: aipsxtype.h:39