ObjFW  Check-in [5e65237276]

Overview
Comment:Let operations on OFNumbers return a new one.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 5e652372765f097365a45b4eebe00beb047514faa4b08d6bc0b42a1a6408e5eb
User & Date: js on 2010-03-05 03:21:49
Other Links: manifest | tags
Context
2010-03-13
21:24
Add global variable of_pagesize and use it to reduce code duplication. check-in: 382ed34d40 user: js tags: trunk
2010-03-05
03:21
Let operations on OFNumbers return a new one. check-in: 5e65237276 user: js tags: trunk
00:04
Improve -[hash] for OFNumbers with floats and doubles. check-in: 5265f8d08b user: js tags: trunk
Changes

Modified src/OFNumber.h from [6900966d0c] to [b4de2a5a33].

533
534
535
536
537
538
539
540
541
542

543
544
545
546
547
548
549

550
551
552
553
554
555
556

557
558
559
560
561
562
563

564
565
566
567
568

569
570
571
572
573

574
575
576
533
534
535
536
537
538
539


540
541
542
543
544
545


546
547
548
549
550
551


552
553
554
555
556
557


558
559
560
561
562
563

564
565
566
567
568

569
570
571
572







-
-

+




-
-

+




-
-

+




-
-

+




-
+




-
+




/**
 * \return The OFNumber as a double
 */
- (double)asDouble;

/**
 * Adds the specified OFNumber to the OFNumber.
 *
 * \param num The OFNumber to add
 * \return The OFNumber added with the specified OFNumber
 */
- add: (OFNumber*)num;

/**
 * Subtracts the specified OFNumber from the OFNumber.
 *
 * \param num The OFNumber to substract
 * \return The OFNumber subtracted by the specified OFNumber
 */
- subtract: (OFNumber*)num;

/**
 * Multiplies the OFNumber with the specified OFNumber.
 *
 * \param num The OFNumber to multiply with
 * \return The OFNumber multiplied with the specified OFNumber
 */
- multiplyWith: (OFNumber*)num;

/**
 * Divides the OFNumber by the specified OFNumber.
 *
 * \param num The OFNumber to divide by
 * \return The OFNumber devided by the specified OFNumber
 */
- divideBy: (OFNumber*)num;

/**
 * Increases the OFNumber by 1.
 * \return The OFNumber increased by one.
 */
- increase;

/**
 * Decreases the OFNumber by 1.
 * \return The OFNumber decreased by one.
 */
- decrease;
@end

Modified src/OFNumber.m from [7ea4c5f34b] to [6467769256].

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

137

138
139

140

141
142

143

144
145
146
147
148
149


150
151

152
153
154

155
156
157

158
159
160

161
162
163

164
165
166

167
168
169

170
171
172

173
174
175

176
177
178

179
180
181

182
183
184

185
186
187

188
189
190

191
192
193

194
195
196

197
198
199

200
201
202

203
204
205

206
207
208

209
210
211

212
213
214

215
216
217

218
219
220

221
222
223
224
225
226
227
228
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
137

138

139
140

141

142
143

144

145
146
147


148
149
150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198
199
200
201
202
203
204







-
-
+
+

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-

+
-
+
-



-
-
+
+

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-

-
+
-







	case OF_NUMBER_FLOAT:						\
		return (t)value.float_;					\
	case OF_NUMBER_DOUBLE:						\
		return (t)value.double_;				\
	default:							\
		@throw [OFInvalidFormatException newWithClass: isa];	\
	}
#define CALCULATE(o)							\
	switch (type) {							\
#define CALCULATE(o, n)							\
	switch (type) { 						\
	case OF_NUMBER_CHAR:						\
		return [OFNumber numberWithChar:			\
		value.char_ o;						\
		    value.char_ o [n asChar]];				\
		break;							\
	case OF_NUMBER_SHORT:						\
		return [OFNumber numberWithShort:			\
		value.short_ o;						\
		    value.short_ o [n asShort]];			\
		break;							\
	case OF_NUMBER_INT:						\
		return [OFNumber numberWithInt:				\
		value.int_ o;						\
		    value.int_ o [n asInt]];				\
		break;							\
	case OF_NUMBER_LONG:						\
		return [OFNumber numberWithLong:			\
		value.long_ o;						\
		    value.long_ o [n asLong]];				\
		break;							\
	case OF_NUMBER_UCHAR:						\
		return [OFNumber numberWithUChar:			\
		value.uchar o;						\
		    value.uchar o [n asUChar]];				\
		break;							\
	case OF_NUMBER_USHORT:						\
		return [OFNumber numberWithUShort:			\
		value.ushort o;						\
		    value.ushort o [n asUShort]];			\
		break;							\
	case OF_NUMBER_UINT:						\
		return [OFNumber numberWithUInt:			\
		value.uint o;						\
		    value.uint o [n asUInt]];				\
		break;							\
	case OF_NUMBER_ULONG:						\
		return [OFNumber numberWithULong:			\
		value.ulong o;						\
		    value.ulong o [n asULong]];				\
		break;							\
	case OF_NUMBER_INT8:						\
		return [OFNumber numberWithInt8:			\
		value.int8 o;						\
		    value.int8 o [n asInt8]];				\
		break;							\
	case OF_NUMBER_INT16:						\
		return [OFNumber numberWithInt16:			\
		value.int16 o;						\
		    value.int16 o [n asInt16]];				\
		break;							\
	case OF_NUMBER_INT32:						\
		return [OFNumber numberWithInt32:			\
		value.int32 o;						\
		    value.int32 o [n asInt32]];				\
		break;							\
	case OF_NUMBER_INT64:						\
		return [OFNumber numberWithInt64:			\
		value.int64 o;						\
		    value.int64 o [n asInt64]];				\
		break;							\
	case OF_NUMBER_UINT8:						\
		return [OFNumber numberWithUInt8:			\
		value.uint8 o;						\
		    value.uint8 o [n asUInt8]];				\
		break;							\
	case OF_NUMBER_UINT16:						\
		return [OFNumber numberWithUInt16:			\
		value.uint16 o;						\
		    value.uint16 o [n asUInt16]];			\
		break;							\
	case OF_NUMBER_UINT32:						\
		return [OFNumber numberWithUInt32:			\
		value.uint32 o;						\
		    value.uint32 o [n asUInt32]];			\
		break;							\
	case OF_NUMBER_UINT64:						\
		return [OFNumber numberWithUInt64:			\
		value.uint64 o;						\
		    value.uint64 o [n asUInt64]];			\
		break;							\
	case OF_NUMBER_SIZE:						\
		return [OFNumber numberWithSize:			\
		value.size o;						\
		    value.size o [n asSize]];				\
		break;							\
	case OF_NUMBER_SSIZE:						\
		return [OFNumber numberWithSSize:			\
		value.ssize o;						\
		    value.ssize o [n asSSize]];				\
		break;							\
	case OF_NUMBER_INTMAX:						\
		return [OFNumber numberWithIntMax:			\
		value.intmax o;						\
		    value.intmax o [n asIntMax]];			\
		break;							\
	case OF_NUMBER_UINTMAX:						\
		return [OFNumber numberWithUIntMax:			\
		value.uintmax o;					\
		    value.uintmax o [n asUIntMax]];			\
		break;							\
	case OF_NUMBER_PTRDIFF:						\
		return [OFNumber numberWithPtrDiff:			\
		value.ptrdiff o;					\
		    value.ptrdiff o [n asPtrDiff]];			\
		break;							\
	case OF_NUMBER_INTPTR:						\
		return [OFNumber numberWithIntPtr:			\
		value.intptr o;						\
		    value.intptr o [n asIntPtr]];			\
		break;							\
	case OF_NUMBER_FLOAT:						\
		return [OFNumber numberWithFloat:			\
		value.float_ o;						\
		    value.float_ o [n asFloat]];			\
		break;							\
	case OF_NUMBER_DOUBLE:						\
		return [OFNumber numberWithDouble:			\
		value.double_ o;					\
		    value.double_ o [n asDouble]];			\
		break;							\
	default:							\
		@throw [OFInvalidFormatException newWithClass: isa];	\
	}
#define CALCULATE2(o, n)						\
	switch (type) { 						\
#define CALCULATE2(o)							\
	switch (type) {							\
	case OF_NUMBER_CHAR:						\
		value.char_ o [n asChar];				\
		return [OFNumber numberWithChar: value.char_ o];	\
		break;							\
	case OF_NUMBER_SHORT:						\
		value.short_ o [n asShort];				\
		return [OFNumber numberWithShort: value.short_ o];	\
		break;							\
	case OF_NUMBER_INT:						\
		value.int_ o [n asInt];					\
		return [OFNumber numberWithInt: value.int_ o];		\
		break;							\
	case OF_NUMBER_LONG:						\
		value.long_ o [n asLong];				\
		return [OFNumber numberWithLong: value.long_ o];	\
		break;							\
	case OF_NUMBER_UCHAR:						\
		value.uchar o [n asUChar];				\
		return [OFNumber numberWithUChar: value.uchar o];	\
		break;							\
	case OF_NUMBER_USHORT:						\
		value.ushort o [n asUShort];				\
		return [OFNumber numberWithUShort: value.ushort o];	\
		break;							\
	case OF_NUMBER_UINT:						\
		value.uint o [n asUInt];				\
		return [OFNumber numberWithUInt: value.uint o];		\
		break;							\
	case OF_NUMBER_ULONG:						\
		value.ulong o [n asULong];				\
		return [OFNumber numberWithULong: value.ulong o];	\
		break;							\
	case OF_NUMBER_INT8:						\
		value.int8 o [n asInt8];				\
		return [OFNumber numberWithInt8: value.int8 o];		\
		break;							\
	case OF_NUMBER_INT16:						\
		value.int16 o [n asInt16];				\
		return [OFNumber numberWithInt16: value.int16 o];	\
		break;							\
	case OF_NUMBER_INT32:						\
		value.int32 o [n asInt32];				\
		return [OFNumber numberWithInt32: value.int32 o];	\
		break;							\
	case OF_NUMBER_INT64:						\
		value.int64 o [n asInt64];				\
		return [OFNumber numberWithInt64: value.int64 o];	\
		break;							\
	case OF_NUMBER_UINT8:						\
		value.uint8 o [n asUInt8];				\
		return [OFNumber numberWithUInt8: value.uint8 o];	\
		break;							\
	case OF_NUMBER_UINT16:						\
		value.uint16 o [n asUInt16];				\
		return [OFNumber numberWithUInt16: value.uint16 o];	\
		break;							\
	case OF_NUMBER_UINT32:						\
		value.uint32 o [n asUInt32];				\
		return [OFNumber numberWithUInt32: value.uint32 o];	\
		break;							\
	case OF_NUMBER_UINT64:						\
		value.uint64 o [n asUInt64];				\
		return [OFNumber numberWithUInt64: value.uint64 o];	\
		break;							\
	case OF_NUMBER_SIZE:						\
		value.size o [n asSize];				\
		return [OFNumber numberWithSize: value.size o];		\
		break;							\
	case OF_NUMBER_SSIZE:						\
		value.ssize o [n asSSize];				\
		return [OFNumber numberWithSSize: value.ssize o];	\
		break;							\
	case OF_NUMBER_INTMAX:						\
		value.intmax o [n asIntMax];				\
		return [OFNumber numberWithIntMax: value.intmax o];	\
		break;							\
	case OF_NUMBER_UINTMAX:						\
		value.uintmax o [n asUIntMax];				\
		return [OFNumber numberWithUIntMax: value.uintmax o];	\
		break;							\
	case OF_NUMBER_PTRDIFF:						\
		value.ptrdiff o [n asPtrDiff];				\
		return [OFNumber numberWithPtrDiff: value.ptrdiff o];	\
		break;							\
	case OF_NUMBER_INTPTR:						\
		value.intptr o [n asIntPtr];				\
		return [OFNumber numberWithIntPtr: value.intptr o];	\
		break;							\
	case OF_NUMBER_FLOAT:						\
		value.float_ o [n asFloat];				\
		return [OFNumber numberWithFloat: value.float_ o];	\
		break;							\
	case OF_NUMBER_DOUBLE:						\
		value.double_ o [n asDouble];				\
		return [OFNumber numberWithDouble: value.double_ o];	\
		break;							\
	default:							\
		@throw [OFInvalidFormatException newWithClass: isa];	\
	}

@implementation OFNumber
+ numberWithChar: (char)char_
{
780
781
782
783
784
785
786
787

788
789
790
791
792
793

794
795
796
797
798
799

800
801
802
803
804
805

806
807
808
809
810
811

812
813
814
815
816
817

818
819
820
756
757
758
759
760
761
762

763

764
765
766
767

768

769
770
771
772

773

774
775
776
777

778

779
780
781
782

783

784
785
786
787

788

789
790







-
+
-




-
+
-




-
+
-




-
+
-




-
+
-




-
+
-


	default:
		return [self asUInt32];
	}
}

- add: (OFNumber*)num
{
	CALCULATE2(+=, num)
	CALCULATE(+, num)
	return self;
}

- subtract: (OFNumber*)num
{
	CALCULATE2(-=, num)
	CALCULATE(-, num)
	return self;
}

- multiplyWith: (OFNumber*)num
{
	CALCULATE2(*=, num)
	CALCULATE(*, num)
	return self;
}

- divideBy: (OFNumber*)num
{
	CALCULATE2(/=, num)
	CALCULATE(/, num)
	return self;
}

- increase
{
	CALCULATE(++)
	CALCULATE2(+ 1)
	return self;
}

- decrease
{
	CALCULATE(--)
	CALCULATE2(- 1)
	return self;
}
@end