Home | History | Annotate | Line # | Download | only in regression
      1  1.1  christos /*
      2  1.1  christos  * Copyright (c) Meta Platforms, Inc. and affiliates.
      3  1.1  christos  * All rights reserved.
      4  1.1  christos  *
      5  1.1  christos  * This source code is licensed under both the BSD-style license (found in the
      6  1.1  christos  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
      7  1.1  christos  * in the COPYING file in the root directory of this source tree).
      8  1.1  christos  * You may select, at your option, one of the above-listed licenses.
      9  1.1  christos  */
     10  1.1  christos 
     11  1.1  christos #ifndef RESULT_H
     12  1.1  christos #define RESULT_H
     13  1.1  christos 
     14  1.1  christos #include <stddef.h>
     15  1.1  christos 
     16  1.1  christos /**
     17  1.1  christos  * The error type enum.
     18  1.1  christos  */
     19  1.1  christos typedef enum {
     20  1.1  christos     result_error_ok,                   /**< No error. */
     21  1.1  christos     result_error_skip,                 /**< This method was skipped. */
     22  1.1  christos     result_error_system_error,         /**< Some internal error happened. */
     23  1.1  christos     result_error_compression_error,    /**< Compression failed. */
     24  1.1  christos     result_error_decompression_error,  /**< Decompression failed. */
     25  1.1  christos     result_error_round_trip_error,     /**< Data failed to round trip. */
     26  1.1  christos } result_error_t;
     27  1.1  christos 
     28  1.1  christos /**
     29  1.1  christos  * The success type.
     30  1.1  christos  */
     31  1.1  christos typedef struct {
     32  1.1  christos     size_t total_size;  /**< The total compressed size. */
     33  1.1  christos } result_data_t;
     34  1.1  christos 
     35  1.1  christos /**
     36  1.1  christos  * The result type.
     37  1.1  christos  * Do not access the member variables directory, use the helper functions.
     38  1.1  christos  */
     39  1.1  christos typedef struct {
     40  1.1  christos     result_error_t internal_error;
     41  1.1  christos     result_data_t internal_data;
     42  1.1  christos } result_t;
     43  1.1  christos 
     44  1.1  christos /**
     45  1.1  christos  * Create a result of the error type.
     46  1.1  christos  */
     47  1.1  christos static result_t result_error(result_error_t error);
     48  1.1  christos /**
     49  1.1  christos  * Create a result of the success type.
     50  1.1  christos  */
     51  1.1  christos static result_t result_data(result_data_t data);
     52  1.1  christos 
     53  1.1  christos /**
     54  1.1  christos  * Check if the result is an error or skip.
     55  1.1  christos  */
     56  1.1  christos static int result_is_error(result_t result);
     57  1.1  christos /**
     58  1.1  christos  * Check if the result error is skip.
     59  1.1  christos  */
     60  1.1  christos static int result_is_skip(result_t result);
     61  1.1  christos /**
     62  1.1  christos  * Get the result error or okay.
     63  1.1  christos  */
     64  1.1  christos static result_error_t result_get_error(result_t result);
     65  1.1  christos /**
     66  1.1  christos  * Get the result data. The result MUST be checked with result_is_error() first.
     67  1.1  christos  */
     68  1.1  christos static result_data_t result_get_data(result_t result);
     69  1.1  christos 
     70  1.1  christos static result_t result_error(result_error_t error) {
     71  1.1  christos     result_t result = {
     72  1.1  christos         .internal_error = error,
     73  1.1  christos     };
     74  1.1  christos     return result;
     75  1.1  christos }
     76  1.1  christos 
     77  1.1  christos static result_t result_data(result_data_t data) {
     78  1.1  christos     result_t result = {
     79  1.1  christos         .internal_error = result_error_ok,
     80  1.1  christos         .internal_data = data,
     81  1.1  christos     };
     82  1.1  christos     return result;
     83  1.1  christos }
     84  1.1  christos 
     85  1.1  christos static int result_is_error(result_t result) {
     86  1.1  christos     return result_get_error(result) != result_error_ok;
     87  1.1  christos }
     88  1.1  christos 
     89  1.1  christos static int result_is_skip(result_t result) {
     90  1.1  christos     return result_get_error(result) == result_error_skip;
     91  1.1  christos }
     92  1.1  christos 
     93  1.1  christos static result_error_t result_get_error(result_t result) {
     94  1.1  christos     return result.internal_error;
     95  1.1  christos }
     96  1.1  christos 
     97  1.1  christos char const* result_get_error_string(result_t result);
     98  1.1  christos 
     99  1.1  christos static result_data_t result_get_data(result_t result) {
    100  1.1  christos     return result.internal_data;
    101  1.1  christos }
    102  1.1  christos 
    103  1.1  christos #endif
    104