casacore
Loading...
Searching...
No Matches
Public Types | Public Member Functions | List of all members
casacore::DataType_global_functions_DataType Struct Reference

More...

#include <DataType.h>

Public Types

enum  DataType {
  TpBool ,
  TpChar ,
  TpUChar ,
  TpShort ,
  TpUShort ,
  TpInt ,
  TpUInt ,
  TpFloat ,
  TpDouble ,
  TpComplex ,
  TpDComplex ,
  TpString ,
  TpTable ,
  TpArrayBool ,
  TpArrayChar ,
  TpArrayUChar ,
  TpArrayShort ,
  TpArrayUShort ,
  TpArrayInt ,
  TpArrayUInt ,
  TpArrayFloat ,
  TpArrayDouble ,
  TpArrayComplex ,
  TpArrayDComplex ,
  TpArrayString ,
  TpRecord ,
  TpOther ,
  TpQuantity ,
  TpArrayQuantity ,
  TpInt64 ,
  TpArrayInt64 ,
  TpNumberOfTypes
}
 

Public Member Functions

ostream & operator<< (ostream &os, DataType type)
 Write a formated representation (e.g., Type=Bool) of the given data type.
 
template<typename T >
DataType whatType ()
 These (specialized) functions return the DataType that corresponds to the template type.
 
DataType asScalar (DataType type)
 It is sometimes useful to discover what the corresponding scalar (or array) type is for a given array (or scalar) type.
 
DataType asArray (DataType type)
 
constexpr size_t SizeOfType (DataType dtype)
 Returns the number of bytes that this type takes when serialized to disk.
 
Bool isScalar (DataType type)
 It is occasionally useful to discover whether or not a DataType represents an array or scalar value.
 
Bool isArray (DataType type)
 
Bool isScalarFun (DataType type)
 
Bool isReal (DataType type)
 It is sometimes useful to discover if a DataType represents a real numeric value (i.e., can it be cast to a Double?) This returns True for both real scalar and array type.
 
Bool isComplex (DataType type)
 Returns True for Complex or DComplex scalar or array types.
 
Bool isNumeric (DataType type)
 Returns True if the type is either Real or Complex/DComplex.
 

Detailed Description

Data types (primarily) in the table system

Intended use:

Public interface

Review Status

Reviewed By:
Paul Shannon
Date Reviewed:
1995/05/01
Test programs:
tDataType

Synopsis

DataType enumerates possible data types. While this enum is primarily used in the table system, some use of it is made elsewhere. Besides the enum itself, operator<< is defined for DataType; it prints a DataType in the form DataType=Bool.

Also, global functions are written which take a "const pointer to type" and return its DataType (TpOther if unknown). These functions can occasionally allow one to avoid a switch on type, and can be useful in constructing templated classes which are only valid for certain types.

Global functions are also provided which allow one to convert an array type to the equivalent scalar type and vice versa.


Warning: New data types should be added just before TpNumberOfTypes, and after all the existing enumerations, to avoid changing the number of an existing type which would cause misinterpretation of data types stored in existing files; Note also that if any new scalar and array types are added that this will break the exising isScalar, isArray, asScalar and asArray functions;


Tip: Data types long and unsigned long are not possible; The types Int and uInt are always 4 bytes, so long is not needed and may only cause confusion;

Example

The simplest uses of the DataType enumeration and functions are fairly obvious, for example:

Double d;
DataType type = whatType(&d);
cout << type << endl;
switch(type) {
case TpChar:..\.
..\.
case TpDouble:..\.
}
double Double
Definition aipstype.h:53
DataType whatType()
These (specialized) functions return the DataType that corresponds to the template type.
Definition DataType.h:167

A less obvious use is for "attaching" a templated object or function to a non-templated object in a safe way. For example:

class IntFloatContainer {
public:
Int intval;
Float floatval;
void *ptr(DataType type) {
if (type == whatType(&intval))
return &intval;
else if (type == whatType(&floatval))
return &floatval;
else
return 0; // Illegal type
}
};
template<class T> class ValueAccessor {
public:
ValueAccessor(IntFloatContainer *container) : container_p(container) {
if (container_p->ptr(whatType(static_cast<T *>(0))) == 0)
throw(AipsError("Illegal type..."));
}
T &value() { return *((T*)container_p->ptr(whatType(static_cast<T *>(0)))); }
private:
IntFloatContainer *container_p;
};
float Float
Definition aipstype.h:52
int Int
Definition aipstype.h:48
LatticeExprNode value(const LatticeExprNode &expr)
This function returns the value of the expression without a mask.

So, this example provides a typesafe interface to values of only a small number of types (and it fairly gracefully allows additional types to be added; in particular the accessor class needs no modification). Techniques such as this are appropriate for situations where one needs to deal with many (but finite) numbers of types. For example, with FITS.

To Do

Enumeration of the possible data types for keywords and table columns.

Definition at line 139 of file DataType.h.

Member Enumeration Documentation

◆ DataType

Enumerator
TpBool 
TpChar 
TpUChar 
TpShort 
TpUShort 
TpInt 
TpUInt 
TpFloat 
TpDouble 
TpComplex 
TpDComplex 
TpString 
TpTable 
TpArrayBool 
TpArrayChar 
TpArrayUChar 
TpArrayShort 
TpArrayUShort 
TpArrayInt 
TpArrayUInt 
TpArrayFloat 
TpArrayDouble 
TpArrayComplex 
TpArrayDComplex 
TpArrayString 
TpRecord 
TpOther 
TpQuantity 
TpArrayQuantity 
TpInt64 
TpArrayInt64 
TpNumberOfTypes 

Since we start at zero, this is the number of types in the enum.

Definition at line 140 of file DataType.h.

Member Function Documentation

◆ asArray()

DataType casacore::DataType_global_functions_DataType::asArray ( DataType  type)

◆ asScalar()

DataType casacore::DataType_global_functions_DataType::asScalar ( DataType  type)

It is sometimes useful to discover what the corresponding scalar (or array) type is for a given array (or scalar) type.

Calling these with TpOther, TpTable, and TpRecord results in an exception being thrown.

◆ isArray()

Bool casacore::DataType_global_functions_DataType::isArray ( DataType  type)

◆ isComplex()

Bool casacore::DataType_global_functions_DataType::isComplex ( DataType  type)

Returns True for Complex or DComplex scalar or array types.

◆ isNumeric()

Bool casacore::DataType_global_functions_DataType::isNumeric ( DataType  type)

Returns True if the type is either Real or Complex/DComplex.

◆ isReal()

Bool casacore::DataType_global_functions_DataType::isReal ( DataType  type)

It is sometimes useful to discover if a DataType represents a real numeric value (i.e., can it be cast to a Double?) This returns True for both real scalar and array type.

◆ isScalar()

Bool casacore::DataType_global_functions_DataType::isScalar ( DataType  type)

It is occasionally useful to discover whether or not a DataType represents an array or scalar value.

Note that TpTable, TpRecord, and TpOther are neither scalar nor array types.

◆ isScalarFun()

Bool casacore::DataType_global_functions_DataType::isScalarFun ( DataType  type)

◆ operator<<()

ostream & casacore::DataType_global_functions_DataType::operator<< ( ostream &  os,
DataType  type 
)

Write a formated representation (e.g., Type=Bool) of the given data type.

◆ SizeOfType()

constexpr size_t casacore::DataType_global_functions_DataType::SizeOfType ( DataType  dtype)
inlineconstexpr

Returns the number of bytes that this type takes when serialized to disk.

For dynamic types (arrays, records, etc.), a value of 0 is returned. TpBool returns a value of 1, but be aware that it may be stored with bit-packing.

Definition at line 223 of file DataType.h.

References TpArrayBool, TpArrayChar, TpArrayComplex, TpArrayDComplex, TpArrayDouble, TpArrayFloat, TpArrayInt, TpArrayInt64, TpArrayQuantity, TpArrayShort, TpArrayString, TpArrayUChar, TpArrayUInt, TpArrayUShort, TpBool, TpChar, TpComplex, TpDComplex, TpDouble, TpFloat, TpInt, TpInt64, TpNumberOfTypes, TpOther, TpQuantity, TpRecord, TpShort, TpString, TpTable, TpUChar, TpUInt, and TpUShort.

◆ whatType()

template<typename T >
DataType casacore::DataType_global_functions_DataType::whatType ( )
inline

These (specialized) functions return the DataType that corresponds to the template type.

TpOther is returned for types that are not specialized, as is void.

Definition at line 167 of file DataType.h.

References TpOther.


The documentation for this struct was generated from the following file: