8
8
#include < common/CastUtils.hpp>
9
9
#include < common/config.hpp>
10
10
11
+ #ifdef ENABLE_TRACING
12
+
13
+ #include < traceing.hpp>
14
+
15
+ #endif
16
+
11
17
#ifdef USE_SOURCE_LOCATION_TRACKING
18
+
12
19
#include < common/source_location.hpp>
20
+
13
21
#endif
14
22
15
23
@@ -19,7 +27,6 @@ namespace nautilus {
19
27
};
20
28
21
29
22
-
23
30
template <class T >
24
31
concept is_base_type = std::is_base_of<base_value, T>::value;
25
32
@@ -118,17 +125,28 @@ namespace nautilus {
118
125
119
126
#ifdef USE_SOURCE_LOCATION_TRACKING
120
127
128
+
121
129
inline val<ValueType>(ValueType value, const std::source_location loc = std::source_location::current())
122
- : value(value), loc(loc) {};
130
+ : value(value), loc(loc) {
131
+
132
+ std::cout << loc.file_name () << std::endl;
133
+ };
134
+
123
135
124
136
inline val<ValueType>(const val<ValueType> &other,
125
137
const std::source_location loc = std::source_location::current())
126
138
: value(other.value), loc(loc) {};
127
139
#else
140
+
128
141
inline val<ValueType>(ValueType value) : value(value) {};
142
+
129
143
inline val<ValueType>(const val<ValueType> &other) : value(other.value) {};
130
144
#endif
131
145
146
+ #ifdef ENABLE_TRACING
147
+
148
+ inline val<ValueType>(tracing::TraceState *tc) : state(tc) {};
149
+ #endif
132
150
133
151
val<ValueType> &operator =(const val<ValueType> &other) {
134
152
this ->value = other.value ;
@@ -143,6 +161,7 @@ namespace nautilus {
143
161
}
144
162
145
163
operator bool () const {
164
+ // traceBool(state);
146
165
// cast
147
166
return value;
148
167
}
@@ -182,6 +201,11 @@ namespace nautilus {
182
201
const std::source_location loc;
183
202
#endif
184
203
204
+ #ifdef ENABLE_TRACING
205
+ tracing::TraceState *state;
206
+ #endif
207
+
208
+
185
209
private:
186
210
friend class val_ptr <ValueType *>;
187
211
@@ -256,6 +280,7 @@ namespace nautilus {
256
280
return val<Type>(value);
257
281
};
258
282
283
+
259
284
template <is_fundamental LeftType, is_fundamental RightType>
260
285
auto cast_value (val<LeftType> &value) {
261
286
typedef typename std::common_type<LeftType, RightType>::type commonType;
@@ -267,175 +292,190 @@ namespace nautilus {
267
292
};
268
293
269
294
namespace details {
295
+
296
+ #ifdef ENABLE_TRACING
297
+ #define TRAC_BINARY_OP (OP ) \
298
+ if (tracing::inTracer()) {\
299
+ auto tc = traceBinaryOp<tracing::OP, commonType>(lValue.state , rValue.state );\
300
+ return val<commonType>(tc);\
301
+ }
302
+ #else
303
+ #define TRAC_OP (OP )
304
+ #endif
305
+
306
+ #ifdef ENABLE_TRACING
307
+ #define TRAC_LOGICAL_BINARY_OP (OP ) \
308
+ if (tracing::inTracer()) {\
309
+ auto tc = traceBinaryOp<tracing::OP, commonType>(lValue.state , rValue.state );\
310
+ return val<bool >(tc);\
311
+ }
312
+ #else
313
+ #define TRAC_LOGICAL_BINARY_OP (OP )
314
+ #endif
315
+
270
316
template <is_fundamental LHS, is_fundamental RHS>
271
317
COMMON_RETURN_TYPE add (val<LHS> &left, val<RHS> &right) {
272
- #ifdef USE_SOURCE_LOCATION_TRACKING
273
- std::cout << left.loc .file_name () << std::endl;
274
- #endif
275
318
typedef typename std::common_type<LHS, RHS>::type commonType;
276
319
auto lValue = cast_value<LHS, commonType>(left);
277
320
auto rValue = cast_value<RHS, commonType>(right);
321
+
322
+ TRAC_BINARY_OP (ADD)
278
323
return lValue.value + rValue.value ;
279
324
}
280
325
281
326
template <is_fundamental LHS, is_fundamental RHS>
282
327
COMMON_RETURN_TYPE inline sub (val<LHS> &left, val<RHS> &right) {
283
- #ifdef USE_SOURCE_LOCATION_TRACKING
284
- std::cout << left.loc .file_name () << std::endl;
285
- #endif
286
- auto lValue = cast_value<LHS, RHS>(left);
287
- auto rValue = cast_value<RHS, LHS>(right);
328
+ typedef typename std::common_type<LHS, RHS>::type commonType;
329
+ auto lValue = cast_value<LHS, commonType>(left);
330
+ auto rValue = cast_value<RHS, commonType>(right);
331
+ TRAC_BINARY_OP (SUB)
288
332
return lValue.value - rValue.value ;
289
333
}
290
334
291
335
template <is_fundamental LHS, is_fundamental RHS>
292
336
COMMON_RETURN_TYPE mul (val<LHS> &left, val<RHS> &right) {
293
- #ifdef USE_SOURCE_LOCATION_TRACKING
294
- std::cout << left.loc .file_name () << std::endl;
295
- #endif
296
- auto lValue = cast_value<LHS, RHS>(left);
297
- auto rValue = cast_value<RHS, LHS>(right);
337
+ typedef typename std::common_type<LHS, RHS>::type commonType;
338
+ auto lValue = cast_value<LHS, commonType>(left);
339
+ auto rValue = cast_value<RHS, commonType>(right);
340
+ TRAC_BINARY_OP (MUL)
298
341
return lValue.value * rValue.value ;
299
342
}
300
343
301
344
template <is_fundamental LHS, is_fundamental RHS>
302
345
COMMON_RETURN_TYPE inline div (val<LHS> &left, val<RHS> &right) {
303
- #ifdef USE_SOURCE_LOCATION_TRACKING
304
- std::cout << left.loc .file_name () << std::endl;
305
- #endif
306
- auto lValue = cast_value<LHS, RHS>(left);
307
- auto rValue = cast_value<RHS, LHS>(right);
346
+ typedef typename std::common_type<LHS, RHS>::type commonType;
347
+ auto lValue = cast_value<LHS, commonType>(left);
348
+ auto rValue = cast_value<RHS, commonType>(right);
349
+ TRAC_BINARY_OP (DIV)
308
350
return lValue.value / rValue.value ;
309
351
}
310
352
311
353
template <is_fundamental LHS, is_fundamental RHS>
312
354
val<bool > inline eq (val<LHS> &left, val<RHS> &right) {
313
- #ifdef USE_SOURCE_LOCATION_TRACKING
314
- std::cout << left.loc .file_name () << std::endl;
315
- #endif
316
- auto lValue = cast_value<LHS, RHS>(left);
317
- auto rValue = cast_value<RHS, LHS>(right);
355
+ typedef typename std::common_type<LHS, RHS>::type commonType;
356
+ auto lValue = cast_value<LHS, commonType>(left);
357
+ auto rValue = cast_value<RHS, commonType>(right);
358
+ TRAC_LOGICAL_BINARY_OP (EQ)
318
359
return lValue.value == rValue.value ;
319
360
}
320
361
321
362
template <is_fundamental LHS, is_fundamental RHS>
322
363
val<bool > inline neq (val<LHS> &left, val<RHS> &right) {
323
- #ifdef USE_SOURCE_LOCATION_TRACKING
324
- std::cout << left.loc .file_name () << std::endl;
325
- #endif
326
- auto lValue = cast_value<LHS, RHS>(left);
327
- auto rValue = cast_value<RHS, LHS>(right);
364
+ typedef typename std::common_type<LHS, RHS>::type commonType;
365
+ auto lValue = cast_value<LHS, commonType>(left);
366
+ auto rValue = cast_value<RHS, commonType>(right);
367
+ TRAC_LOGICAL_BINARY_OP (NEQ)
328
368
return lValue.value != rValue.value ;
329
369
}
330
370
331
371
template <is_fundamental LHS, is_fundamental RHS>
332
372
val<bool > inline lt (val<LHS> &left, val<RHS> &right) {
333
- #ifdef USE_SOURCE_LOCATION_TRACKING
334
- std::cout << left.loc .file_name () << std::endl;
335
- #endif
336
- auto lValue = cast_value<LHS, RHS>(left);
337
- auto rValue = cast_value<RHS, LHS>(right);
373
+ typedef typename std::common_type<LHS, RHS>::type commonType;
374
+ auto lValue = cast_value<LHS, commonType>(left);
375
+ auto rValue = cast_value<RHS, commonType>(right);
376
+ TRAC_LOGICAL_BINARY_OP (LT)
338
377
return lValue.value < rValue.value ;
339
378
}
340
379
341
380
template <is_fundamental LHS, is_fundamental RHS>
342
381
val<bool > inline lte (val<LHS> &left, val<RHS> &right) {
343
- #ifdef USE_SOURCE_LOCATION_TRACKING
344
- std::cout << left.loc .file_name () << std::endl;
345
- #endif
346
- auto lValue = cast_value<LHS, RHS>(left);
347
- auto rValue = cast_value<RHS, LHS>(right);
382
+ typedef typename std::common_type<LHS, RHS>::type commonType;
383
+ auto lValue = cast_value<LHS, commonType>(left);
384
+ auto rValue = cast_value<RHS, commonType>(right);
385
+ TRAC_LOGICAL_BINARY_OP (LTE)
348
386
return lValue.value <= rValue.value ;
349
387
}
350
388
351
389
template <is_fundamental LHS, is_fundamental RHS>
352
390
val<bool > inline gt (val<LHS> &left, val<RHS> &right) {
353
- #ifdef USE_SOURCE_LOCATION_TRACKING
354
- std::cout << left.loc .file_name () << std::endl;
355
- #endif
356
- auto lValue = cast_value<LHS, RHS>(left);
357
- auto rValue = cast_value<RHS, LHS>(right);
391
+ typedef typename std::common_type<LHS, RHS>::type commonType;
392
+ auto lValue = cast_value<LHS, commonType>(left);
393
+ auto rValue = cast_value<RHS, commonType>(right);
394
+ TRAC_LOGICAL_BINARY_OP (GT)
358
395
return lValue.value > rValue.value ;
359
396
}
360
397
361
398
template <is_fundamental LHS, is_fundamental RHS>
362
399
val<bool > inline gte (val<LHS> &left, val<RHS> &right) {
363
- #ifdef USE_SOURCE_LOCATION_TRACKING
364
- std::cout << left.loc .file_name () << std::endl;
365
- #endif
366
- auto lValue = cast_value<LHS, RHS>(left);
367
- auto rValue = cast_value<RHS, LHS>(right);
400
+ typedef typename std::common_type<LHS, RHS>::type commonType;
401
+ auto lValue = cast_value<LHS, commonType>(left);
402
+ auto rValue = cast_value<RHS, commonType>(right);
403
+ TRAC_LOGICAL_BINARY_OP (GTE)
368
404
return lValue.value >= rValue.value ;
369
405
}
370
406
371
407
val<bool > inline lOr (val<bool > &left, val<bool > &right) {
372
- #ifdef USE_SOURCE_LOCATION_TRACKING
373
- std::cout << left.loc .file_name () << std::endl;
374
- #endif
408
+ if (tracing::inTracer ()) {
409
+ auto tc = traceBinaryOp<tracing::OR, bool >(left.state , right.state );
410
+ return {tc};
411
+ }
375
412
return left.value || right.value ;
376
413
}
377
414
378
415
val<bool > inline lAnd (val<bool > &left, val<bool > &right) {
379
- #ifdef USE_SOURCE_LOCATION_TRACKING
380
- std::cout << left.loc .file_name () << std::endl;
381
- #endif
416
+ if (tracing::inTracer ()) {
417
+ auto tc = traceBinaryOp<tracing::AND, bool >(left.state , right.state );
418
+ return {tc};
419
+ }
382
420
return left.value && right.value ;
383
421
}
384
422
385
423
val<bool > inline lNot (val<bool > &val) {
386
- #ifdef USE_SOURCE_LOCATION_TRACKING
387
- std::cout << val.loc .file_name () << std::endl;
388
- #endif
424
+ if (tracing::inTracer ()) {
425
+ auto tc = traceUnaryOp<tracing::NOT, bool >(val.state );
426
+ return {tc};
427
+ }
389
428
return !val.value ;
390
429
}
391
430
392
431
template <is_integral LHS, is_integral RHS>
393
432
auto inline shr (val<LHS> &left, val<RHS> &right) {
394
- #ifdef USE_SOURCE_LOCATION_TRACKING
395
- std::cout << left.loc .file_name () << std::endl;
396
- #endif
397
- auto lValue = cast_value<LHS, RHS>(left);
398
- auto rValue = cast_value<RHS, LHS>(right);
399
- return make_value (lValue.value >> rValue.value );
433
+ typedef decltype (left.value >> right.value ) resultType;
434
+ auto lValue = cast_value<LHS, resultType>(left);
435
+ auto rValue = cast_value<RHS, resultType>(right);
436
+ if (tracing::inTracer ()) {
437
+ auto tc = traceBinaryOp<tracing::RSH, resultType>(lValue.state , rValue.state );
438
+ return val<resultType>(tc);
439
+ }
440
+ return make_value (left.value >> right.value );
400
441
}
401
442
402
443
template <is_integral LHS, is_integral RHS>
403
444
auto inline shl (val<LHS> &left, val<RHS> &right) {
404
- #ifdef USE_SOURCE_LOCATION_TRACKING
405
- std::cout << left.loc .file_name () << std::endl;
406
- #endif
407
- auto lValue = cast_value<LHS, RHS>(left);
408
- auto rValue = cast_value<RHS, LHS>(right);
445
+ typedef decltype (left.value << right.value ) resultType;
446
+ auto lValue = cast_value<LHS, resultType>(left);
447
+ auto rValue = cast_value<RHS, resultType>(right);
448
+ if (tracing::inTracer ()) {
449
+ auto tc = traceBinaryOp<tracing::LSH, resultType>(lValue.state , rValue.state );
450
+ return val<resultType>(tc);
451
+ }
409
452
return make_value (lValue.value << rValue.value );
410
453
}
411
454
412
455
template <is_fundamental LHS, is_fundamental RHS>
413
456
COMMON_RETURN_TYPE inline mod (val<LHS> &left, val<RHS> &right) {
414
- #ifdef USE_SOURCE_LOCATION_TRACKING
415
- std::cout << left.loc .file_name () << std::endl;
416
- #endif
417
- auto lValue = cast_value<LHS, RHS>(left);
418
- auto rValue = cast_value<RHS, LHS>(right);
457
+ typedef typename std::common_type<LHS, RHS>::type commonType;
458
+ auto lValue = cast_value<LHS, commonType>(left);
459
+ auto rValue = cast_value<RHS, commonType>(right);
460
+ TRAC_BINARY_OP (MOD)
419
461
return lValue.value % rValue.value ;
420
462
}
421
463
422
464
template <is_fundamental LHS, is_fundamental RHS>
423
465
COMMON_RETURN_TYPE inline bAnd (val<LHS> &left, val<RHS> &right) {
424
- #ifdef USE_SOURCE_LOCATION_TRACKING
425
- std::cout << left.loc .file_name () << std::endl;
426
- #endif
427
- auto lValue = cast_value<LHS, RHS>(left);
428
- auto rValue = cast_value<RHS, LHS>(right);
466
+ typedef typename std::common_type<LHS, RHS>::type commonType;
467
+ auto lValue = cast_value<LHS, commonType>(left);
468
+ auto rValue = cast_value<RHS, commonType>(right);
469
+ TRAC_BINARY_OP (BAND)
429
470
return lValue.value & rValue.value ;
430
471
}
431
472
432
473
template <is_fundamental LHS, is_fundamental RHS>
433
474
COMMON_RETURN_TYPE inline bOr (val<LHS> &left, val<RHS> &right) {
434
- #ifdef USE_SOURCE_LOCATION_TRACKING
435
- std::cout << left.loc .file_name () << std::endl;
436
- #endif
437
- auto lValue = cast_value<LHS, RHS>(left);
438
- auto rValue = cast_value<RHS, LHS>(right);
475
+ typedef typename std::common_type<LHS, RHS>::type commonType;
476
+ auto lValue = cast_value<LHS, commonType>(left);
477
+ auto rValue = cast_value<RHS, commonType>(right);
478
+ TRAC_BINARY_OP (BOR)
439
479
return lValue.value | rValue.value ;
440
480
}
441
481
0 commit comments