aboutsummaryrefslogtreecommitdiffstats
path: root/CommonLibs/ScalarTypes.h
blob: 077d889ac70997d813c7f0dcae2a6ae5067fa096 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright 2011 Range Networks, Inc.
* All Rights Reserved.
*
* This software is distributed under multiple licenses;
* see the COPYING file in the main directory for licensing
* information for this specific distribuion.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#ifndef SCALARTYPES_H
#define SCALARTYPES_H
#include <iostream>	// For size_t
#include <stdint.h>
//#include "GSMCommon.h"	// Was included for Z100Timer

// We dont bother to define *= /= etc.; you'll have to convert: a*=b; to: a=a*b;
#define _INITIALIZED_SCALAR_BASE_FUNCS(Classname,Basetype,Init) \
	Classname() : value(Init) {} \
	Classname(Basetype wvalue) { value = wvalue; } /* Can set from basetype. */ \
	operator Basetype(void) const { return value; }		/* Converts from basetype. */ \
	Basetype operator=(Basetype wvalue) { return value = wvalue; } \
	Basetype* operator&() { return &value; }

#define _INITIALIZED_SCALAR_ARITH_FUNCS(Basetype) \
	Basetype operator++() { return ++value; } \
	Basetype operator++(int) { return value++; } \
	Basetype operator--() { return --value; } \
	Basetype operator--(int) { return value--; } \
	Basetype operator+=(Basetype wvalue) { return value = value + wvalue; } \
	Basetype operator-=(Basetype wvalue) { return value = value - wvalue; }

#define _INITIALIZED_SCALAR_FUNCS(Classname,Basetype,Init) \
	_INITIALIZED_SCALAR_BASE_FUNCS(Classname,Basetype,Init) \
	_INITIALIZED_SCALAR_ARITH_FUNCS(Basetype)


#define _DECLARE_SCALAR_TYPE(Classname_i,Classname_z,Basetype) \
	template <Basetype Init> \
	struct Classname_i { \
		Basetype value; \
		_INITIALIZED_SCALAR_FUNCS(Classname_i,Basetype,Init) \
	}; \
	typedef Classname_i<0> Classname_z;


// Usage:
// Where 'classname' is one of the types listed below, then:
// 		classname_z specifies a zero initialized type;
// 		classname_i<value> initializes the type to the specified value.
// We also define Float_z.
_DECLARE_SCALAR_TYPE(Int_i, 	Int_z,  	int)
_DECLARE_SCALAR_TYPE(Char_i,	Char_z, 	signed char)
_DECLARE_SCALAR_TYPE(Int16_i,	Int16_z,	int16_t)
_DECLARE_SCALAR_TYPE(Int32_i,	Int32_z,	int32_t)
_DECLARE_SCALAR_TYPE(UInt_i,  	UInt_z,  	unsigned)
_DECLARE_SCALAR_TYPE(UChar_i,  	UChar_z,  	unsigned char)
_DECLARE_SCALAR_TYPE(UInt16_i,	UInt16_z,	uint16_t)
_DECLARE_SCALAR_TYPE(UInt32_i,	UInt32_z,	uint32_t)
_DECLARE_SCALAR_TYPE(Size_t_i,	Size_t_z,	size_t)

// Bool is special because it cannot accept some arithmetic funcs
//_DECLARE_SCALAR_TYPE(Bool_i,  	Bool_z, 	bool)
template <bool Init>
struct Bool_i {
	bool value;
	_INITIALIZED_SCALAR_BASE_FUNCS(Bool_i,bool,Init)
};
typedef Bool_i<0> Bool_z;

// float is special, because C++ does not permit the template initalization:
struct Float_z {
	float value;
	_INITIALIZED_SCALAR_FUNCS(Float_z,float,0)
};
struct Double_z {
	double value;
	_INITIALIZED_SCALAR_FUNCS(Double_z,double,0)
};


class ItemWithValueAndWidth {
	public:
	virtual unsigned getValue() const = 0;
	virtual unsigned getWidth() const = 0;
};

// A Range Networks Field with a specified width.
// See RLCMessages.h for examples.
template <int Width=32, unsigned Init=0>
class Field_i : public ItemWithValueAndWidth
{
	public:
	unsigned value;
	_INITIALIZED_SCALAR_FUNCS(Field_i,unsigned,Init)
	unsigned getWidth() const { return Width; }
	unsigned getValue() const { return value; }
};

// Synonym for Field_i, but no way to do it.
template <int Width, unsigned Init=0>
class Field_z : public ItemWithValueAndWidth
{
	public:
	unsigned value;
	_INITIALIZED_SCALAR_FUNCS(Field_z,unsigned,Init)
	unsigned getWidth() const { return Width; }
	unsigned getValue() const { return value; }
};

// This is an uninitialized field.
template <int Width=32, unsigned Init=0>
class Field : public ItemWithValueAndWidth
{
	public:
	unsigned value;
	_INITIALIZED_SCALAR_FUNCS(Field,unsigned,Init)
	unsigned getWidth() const { return Width; }
	unsigned getValue() const { return value; }
};


// A Z100Timer with an initial value specified.
//template <int Init>
//class Z100Timer_i : public GSM::Z100Timer {
//	public:
//	Z100Timer_i() : GSM::Z100Timer(Init) {}
//};

#endif