tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Comparison.h (12163B)


      1 /***************************************************************************************************
      2 
      3  Zyan Core Library (Zycore-C)
      4 
      5  Original Author : Florian Bernd
      6 
      7 * Permission is hereby granted, free of charge, to any person obtaining a copy
      8 * of this software and associated documentation files (the "Software"), to deal
      9 * in the Software without restriction, including without limitation the rights
     10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11 * copies of the Software, and to permit persons to whom the Software is
     12 * furnished to do so, subject to the following conditions:
     13 *
     14 * The above copyright notice and this permission notice shall be included in all
     15 * copies or substantial portions of the Software.
     16 *
     17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     23 * SOFTWARE.
     24 
     25 ***************************************************************************************************/
     26 
     27 /**
     28 * @file
     29 * Defines prototypes of general-purpose comparison functions.
     30 */
     31 
     32 #ifndef ZYCORE_COMPARISON_H
     33 #define ZYCORE_COMPARISON_H
     34 
     35 #include "zydis/Zycore/Defines.h"
     36 #include "zydis/Zycore/Types.h"
     37 
     38 #ifdef __cplusplus
     39 extern "C" {
     40 #endif
     41 
     42 /* ============================================================================================== */
     43 /* Enums and types                                                                                */
     44 /* ============================================================================================== */
     45 
     46 /**
     47 * Defines the `ZyanEqualityComparison` function prototype.
     48 *
     49 * @param   left    A pointer to the first element.
     50 * @param   right   A pointer to the second element.
     51 *
     52 * @return  This function should return `ZYAN_TRUE` if the `left` element equals the `right` one
     53 *          or `ZYAN_FALSE`, if not.
     54 */
     55 typedef ZyanBool (*ZyanEqualityComparison)(const void* left, const void* right);
     56 
     57 /**
     58 * Defines the `ZyanComparison` function prototype.
     59 *
     60 * @param   left    A pointer to the first element.
     61 * @param   right   A pointer to the second element.
     62 *
     63 * @return  This function should return values in the following range:
     64 *          `left == right -> result == 0`
     65 *          `left <  right -> result  < 0`
     66 *          `left >  right -> result  > 0`
     67 */
     68 typedef ZyanI32 (*ZyanComparison)(const void* left, const void* right);
     69 
     70 /* ============================================================================================== */
     71 /* Macros                                                                                         */
     72 /* ============================================================================================== */
     73 
     74 /* ---------------------------------------------------------------------------------------------- */
     75 /* Equality comparison functions                                                                  */
     76 /* ---------------------------------------------------------------------------------------------- */
     77 
     78 /**
     79 * Declares a generic equality comparison function for an integral data-type.
     80 *
     81 * @param   name    The name of the function.
     82 * @param   type    The name of the integral data-type.
     83 */
     84 #define ZYAN_DECLARE_EQUALITY_COMPARISON(name, type) \
     85    ZyanBool name(const type* left, const type* right) \
     86    { \
     87        ZYAN_ASSERT(left); \
     88        ZYAN_ASSERT(right); \
     89        \
     90        return (*left == *right) ? ZYAN_TRUE : ZYAN_FALSE; \
     91    }
     92 
     93 /**
     94 * Declares a generic equality comparison function that compares a single integral
     95 *          data-type field of a struct.
     96 *
     97 * @param   name        The name of the function.
     98 * @param   type        The name of the integral data-type.
     99 * @param   field_name  The name of the struct field.
    100 */
    101 #define ZYAN_DECLARE_EQUALITY_COMPARISON_FOR_FIELD(name, type, field_name) \
    102    ZyanBool name(const type* left, const type* right) \
    103    { \
    104        ZYAN_ASSERT(left); \
    105        ZYAN_ASSERT(right); \
    106        \
    107        return (left->field_name == right->field_name) ? ZYAN_TRUE : ZYAN_FALSE; \
    108    }
    109 
    110 /* ---------------------------------------------------------------------------------------------- */
    111 /* Comparison functions                                                                           */
    112 /* ---------------------------------------------------------------------------------------------- */
    113 
    114 /**
    115 * Declares a generic comparison function for an integral data-type.
    116 *
    117 * @param   name    The name of the function.
    118 * @param   type    The name of the integral data-type.
    119 */
    120 #define ZYAN_DECLARE_COMPARISON(name, type) \
    121    ZyanI32 name(const type* left, const type* right) \
    122    { \
    123        ZYAN_ASSERT(left); \
    124        ZYAN_ASSERT(right); \
    125        \
    126        if (*left < *right) \
    127        { \
    128            return -1; \
    129        } \
    130        if (*left > *right) \
    131        { \
    132            return  1; \
    133        } \
    134        return 0; \
    135    }
    136 
    137 /**
    138 * Declares a generic comparison function that compares a single integral data-type field
    139 *          of a struct.
    140 *
    141 * @param   name        The name of the function.
    142 * @param   type        The name of the integral data-type.
    143 * @param   field_name  The name of the struct field.
    144 */
    145 #define ZYAN_DECLARE_COMPARISON_FOR_FIELD(name, type, field_name) \
    146    ZyanI32 name(const type* left, const type* right) \
    147    { \
    148        ZYAN_ASSERT(left); \
    149        ZYAN_ASSERT(right); \
    150        \
    151        if (left->field_name < right->field_name) \
    152        { \
    153            return -1; \
    154        } \
    155        if (left->field_name > right->field_name) \
    156        { \
    157            return  1; \
    158        } \
    159        return 0; \
    160    }
    161 
    162 /* ---------------------------------------------------------------------------------------------- */
    163 
    164 /* ============================================================================================== */
    165 /* Exported functions                                                                             */
    166 /* ============================================================================================== */
    167 
    168 /* ---------------------------------------------------------------------------------------------- */
    169 /* Default equality comparison functions                                                          */
    170 /* ---------------------------------------------------------------------------------------------- */
    171 
    172 /**
    173 * Defines a default equality comparison function for pointer values.
    174 *
    175 * @param   left    A pointer to the first value.
    176 * @param   right   A pointer to the second value.
    177 *
    178 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    179 *          not.
    180 */
    181 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsPointer, void* const)
    182 
    183 /**
    184 * Defines a default equality comparison function for `ZyanBool` values.
    185 *
    186 * @param   left    A pointer to the first value.
    187 * @param   right   A pointer to the second value.
    188 *
    189 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    190 *          not.
    191 */
    192 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsBool, ZyanBool)
    193 
    194 /**
    195 * Defines a default equality comparison function for 8-bit numeric values.
    196 *
    197 * @param   left    A pointer to the first value.
    198 * @param   right   A pointer to the second value.
    199 *
    200 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    201 *          not.
    202 */
    203 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric8, ZyanU8)
    204 
    205 /**
    206 * Defines a default equality comparison function for 16-bit numeric values.
    207 *
    208 * @param   left    A pointer to the first value.
    209 * @param   right   A pointer to the second value.
    210 *
    211 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    212 *          not.
    213 */
    214 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric16, ZyanU16)
    215 
    216 /**
    217 * Defines a default equality comparison function for 32-bit numeric values.
    218 *
    219 * @param   left    A pointer to the first value.
    220 * @param   right   A pointer to the second value.
    221 *
    222 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    223 *          not.
    224 */
    225 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric32, ZyanU32)
    226 
    227 /**
    228 * Defines a default equality comparison function for 64-bit numeric values.
    229 *
    230 * @param   left    A pointer to the first value.
    231 * @param   right   A pointer to the second value.
    232 *
    233 * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
    234 *          not.
    235 */
    236 ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric64, ZyanU64)
    237 
    238 /* ---------------------------------------------------------------------------------------------- */
    239 /* Default comparison functions                                                                   */
    240 /* ---------------------------------------------------------------------------------------------- */
    241 
    242 /**
    243 * Defines a default comparison function for pointer values.
    244 *
    245 * @param   left    A pointer to the first value.
    246 * @param   right   A pointer to the second value.
    247 *
    248 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    249 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    250 */
    251 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanComparePointer, void* const)
    252 
    253 /**
    254 * Defines a default comparison function for `ZyanBool` values.
    255 *
    256 * @param   left    A pointer to the first value.
    257 * @param   right   A pointer to the second value.
    258 *
    259 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    260 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    261 */
    262 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareBool, ZyanBool)
    263 
    264 /**
    265 * Defines a default comparison function for 8-bit numeric values.
    266 *
    267 * @param   left    A pointer to the first value.
    268 * @param   right   A pointer to the second value.
    269 *
    270 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    271 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    272 */
    273 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric8, ZyanU8)
    274 
    275 /**
    276 * Defines a default comparison function for 16-bit numeric values.
    277 *
    278 * @param   left    A pointer to the first value.
    279 * @param   right   A pointer to the second value.
    280 *
    281 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    282 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    283 */
    284 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric16, ZyanU16)
    285 
    286 /**
    287 * Defines a default comparison function for 32-bit numeric values.
    288 *
    289 * @param   left    A pointer to the first value.
    290 * @param   right   A pointer to the second value.
    291 *
    292 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    293 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    294 */
    295 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric32, ZyanU32)
    296 
    297 /**
    298 * Defines a default comparison function for 64-bit numeric values.
    299 *
    300 * @param   left    A pointer to the first value.
    301 * @param   right   A pointer to the second value.
    302 *
    303 * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
    304 *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.
    305 */
    306 ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric64, ZyanU64)
    307 
    308 /* ---------------------------------------------------------------------------------------------- */
    309 
    310 /* ============================================================================================== */
    311 
    312 #ifdef __cplusplus
    313 }
    314 #endif
    315 
    316 #endif /* ZYCORE_COMPARISON_H */