ROFL-pipeline  v0.6.0dev
ternary_fields.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef __TERNARY_FIELDS_H__
6 #define __TERNARY_FIELDS_H__
7 
8 #include <stdlib.h>
9 #include <inttypes.h>
10 #include <stdbool.h>
11 #include "rofl.h"
12 #include "wrap_types.h"
13 
19 /* select between the lower and higher parts of the 128 bits value*/
20 
21 //NOTE simplifying all types in a general one
22 typedef enum utern_type {
23  UTERN8_T = 0, //8 bit
24  UTERN16_T = 1, //16 bit
25  //UTERN20_T = 2, //20 bit -> not used
26  UTERN32_T = 3, //32 bit
27  //UTERN48_T = 4, //48 bit -> not used
28  UTERN64_T = 5, //64 bit
29  UTERN128_T = 6 //128 bit
30 }utern_type_t;
31 
32 typedef struct utern{
33  utern_type_t type;
34  wrap_uint_t value;
35  wrap_uint_t mask;
36 } utern_t;
37 
38 /*
39 * Functions
40 */
41 
42 //C++ extern C
43 ROFL_BEGIN_DECLS
44 
45 //Initializers
46 utern_t* __init_utern8(uint8_t value, uint8_t mask);
47 utern_t* __init_utern16(uint16_t value, uint16_t mask);
48 utern_t* __init_utern32(uint32_t value, uint32_t mask);
49 utern_t* __init_utern64(uint64_t value, uint64_t mask);
50 utern_t* __init_utern128(uint128__t value, uint128__t mask);
51 
52 //Destructor
53 rofl_result_t __destroy_utern(utern_t* utern );
54 
55 //Comparison
56 static inline bool __utern_compare8(const utern_t* tern, const uint8_t* value){
57  if(!value)
58  return false;
59  return (tern->value.u8 & tern->mask.u8) == (*value & tern->mask.u8);
60 }
61 static inline bool __utern_compare16(const utern_t* tern, const uint16_t* value){
62  if(!value)
63  return false;
64  return (tern->value.u16 & tern->mask.u16) == (*value & tern->mask.u16);
65 }
66 static inline bool __utern_compare32(const utern_t* tern, const uint32_t* value){
67  if(!value)
68  return false;
69  return (tern->value.u32 & tern->mask.u32) == (*value & tern->mask.u32);
70 }
71 static inline bool __utern_compare64(const utern_t* tern, const uint64_t* value){
72  if(!value)
73  return false;
74  return (tern->value.u64 & tern->mask.u64) == (*value & tern->mask.u64);
75 }
76 static inline bool __utern_compare128(const utern_t* tern, const uint128__t* value){
77  if(!value)
78  return false;
79  return ( (UINT128__T_HI(tern->value.u128) & UINT128__T_HI(tern->mask.u128)) == (UINT128__T_HI(*value) & UINT128__T_HI(tern->mask.u128)) )&&
80  ( (UINT128__T_LO(tern->value.u128) & UINT128__T_LO(tern->mask.u128)) == (UINT128__T_LO(*value) & UINT128__T_LO(tern->mask.u128)) );
81 }
82 //Check if two ternary values are equal
83 bool __utern_equals(const utern_t* tern1, const utern_t* tern2);
84 
85 //Check if a ternary value is a subset of another
86 bool __utern_is_contained(const utern_t* extensive_tern, const utern_t* tern);
87 
88 //Ternary alike functions
89 utern_t* __utern_get_alike(const utern_t tern1, const utern_t tern2);
90 
91 //C++ extern C
92 ROFL_END_DECLS
93 
94 #endif //TERNARY_FIELDS