LCOV - code coverage report
Current view: top level - lib - ovsdb-types.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 23 23 100.0 %
Date: 2016-09-14 01:02:56 Functions: 9 9 100.0 %
Branches: 32 34 94.1 %

           Branch data     Line data    Source code
       1                 :            : /* Copyright (c) 2009, 2010, 2011 Nicira, Inc.
       2                 :            :  *
       3                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       4                 :            :  * you may not use this file except in compliance with the License.
       5                 :            :  * You may obtain a copy of the License at:
       6                 :            :  *
       7                 :            :  *     http://www.apache.org/licenses/LICENSE-2.0
       8                 :            :  *
       9                 :            :  * Unless required by applicable law or agreed to in writing, software
      10                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      11                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12                 :            :  * See the License for the specific language governing permissions and
      13                 :            :  * limitations under the License.
      14                 :            :  */
      15                 :            : 
      16                 :            : #ifndef OVSDB_TYPES_H
      17                 :            : #define OVSDB_TYPES_H 1
      18                 :            : 
      19                 :            : #include <float.h>
      20                 :            : #include <stdbool.h>
      21                 :            : #include <stdint.h>
      22                 :            : #include "compiler.h"
      23                 :            : #include "uuid.h"
      24                 :            : 
      25                 :            : struct json;
      26                 :            : 
      27                 :            : /* An atomic type: one that OVSDB regards as a single unit of data. */
      28                 :            : enum ovsdb_atomic_type {
      29                 :            :     OVSDB_TYPE_VOID,            /* No value. */
      30                 :            :     OVSDB_TYPE_INTEGER,         /* Signed 64-bit integer. */
      31                 :            :     OVSDB_TYPE_REAL,            /* IEEE 754 double-precision floating point. */
      32                 :            :     OVSDB_TYPE_BOOLEAN,         /* True or false. */
      33                 :            :     OVSDB_TYPE_STRING,          /* UTF-8 string. */
      34                 :            :     OVSDB_TYPE_UUID,            /* RFC 4122 UUID referencing a table row. */
      35                 :            :     OVSDB_N_TYPES
      36                 :            : };
      37                 :            : 
      38                 :            : static inline bool ovsdb_atomic_type_is_valid(enum ovsdb_atomic_type);
      39                 :            : bool ovsdb_atomic_type_from_string(const char *, enum ovsdb_atomic_type *);
      40                 :            : struct ovsdb_error *ovsdb_atomic_type_from_json(enum ovsdb_atomic_type *,
      41                 :            :                                                 const struct json *);
      42                 :            : const char *ovsdb_atomic_type_to_string(enum ovsdb_atomic_type);
      43                 :            : struct json *ovsdb_atomic_type_to_json(enum ovsdb_atomic_type);
      44                 :            : 
      45                 :            : /* An atomic type plus optional constraints. */
      46                 :            : 
      47                 :            : enum ovsdb_ref_type {
      48                 :            :     OVSDB_REF_STRONG,           /* Target must exist. */
      49                 :            :     OVSDB_REF_WEAK              /* Delete reference if target disappears. */
      50                 :            : };
      51                 :            : 
      52                 :            : struct ovsdb_base_type {
      53                 :            :     enum ovsdb_atomic_type type;
      54                 :            : 
      55                 :            :     /* If nonnull, a datum with keys of type 'type' that expresses all the
      56                 :            :      * valid values for this base_type. */
      57                 :            :     struct ovsdb_datum *enum_;
      58                 :            : 
      59                 :            :     union {
      60                 :            :         struct ovsdb_integer_constraints {
      61                 :            :             int64_t min;        /* minInteger or INT64_MIN. */
      62                 :            :             int64_t max;        /* maxInteger or INT64_MAX. */
      63                 :            :         } integer;
      64                 :            : 
      65                 :            :         struct ovsdb_real_constraints {
      66                 :            :             double min;         /* minReal or -DBL_MAX. */
      67                 :            :             double max;         /* minReal or DBL_MAX. */
      68                 :            :         } real;
      69                 :            : 
      70                 :            :         /* No constraints for Boolean types. */
      71                 :            : 
      72                 :            :         struct ovsdb_string_constraints {
      73                 :            :             unsigned int minLen; /* minLength or 0. */
      74                 :            :             unsigned int maxLen; /* maxLength or UINT_MAX. */
      75                 :            :         } string;
      76                 :            : 
      77                 :            :         struct ovsdb_uuid_constraints {
      78                 :            :             char *refTableName; /* Name of referenced table, or NULL. */
      79                 :            :             struct ovsdb_table *refTable; /* Referenced table, if available. */
      80                 :            :             enum ovsdb_ref_type refType;  /* Reference type. */
      81                 :            :         } uuid;
      82                 :            :     } u;
      83                 :            : };
      84                 :            : 
      85                 :            : #define OVSDB_BASE_VOID_INIT    { .type = OVSDB_TYPE_VOID }
      86                 :            : #define OVSDB_BASE_INTEGER_INIT { .type = OVSDB_TYPE_INTEGER,           \
      87                 :            :                                   .u.integer = { INT64_MIN, INT64_MAX } }
      88                 :            : #define OVSDB_BASE_REAL_INIT    { .type = OVSDB_TYPE_REAL,          \
      89                 :            :                                   .u.real = { -DBL_MAX, DBL_MAX } }
      90                 :            : #define OVSDB_BASE_BOOLEAN_INIT { .type = OVSDB_TYPE_BOOLEAN }
      91                 :            : #define OVSDB_BASE_STRING_INIT  { .type = OVSDB_TYPE_STRING,    \
      92                 :            :                                   .u.string = { 0, UINT_MAX } }
      93                 :            : #define OVSDB_BASE_UUID_INIT    { .type = OVSDB_TYPE_UUID,      \
      94                 :            :                                   .u.uuid = { NULL, NULL, 0 } }
      95                 :            : 
      96                 :            : void ovsdb_base_type_init(struct ovsdb_base_type *, enum ovsdb_atomic_type);
      97                 :            : void ovsdb_base_type_clone(struct ovsdb_base_type *,
      98                 :            :                            const struct ovsdb_base_type *);
      99                 :            : void ovsdb_base_type_destroy(struct ovsdb_base_type *);
     100                 :            : 
     101                 :            : bool ovsdb_base_type_is_valid(const struct ovsdb_base_type *);
     102                 :            : bool ovsdb_base_type_has_constraints(const struct ovsdb_base_type *);
     103                 :            : void ovsdb_base_type_clear_constraints(struct ovsdb_base_type *);
     104                 :            : const struct ovsdb_type *ovsdb_base_type_get_enum_type(enum ovsdb_atomic_type);
     105                 :            : 
     106                 :            : struct ovsdb_error *ovsdb_base_type_from_json(struct ovsdb_base_type *,
     107                 :            :                                               const struct json *)
     108                 :            :     OVS_WARN_UNUSED_RESULT;
     109                 :            : struct json *ovsdb_base_type_to_json(const struct ovsdb_base_type *);
     110                 :            : 
     111                 :            : static inline bool ovsdb_base_type_is_ref(const struct ovsdb_base_type *);
     112                 :            : static inline bool ovsdb_base_type_is_strong_ref(
     113                 :            :     const struct ovsdb_base_type *);
     114                 :            : static inline bool ovsdb_base_type_is_weak_ref(const struct ovsdb_base_type *);
     115                 :            : 
     116                 :            : /* An OVSDB type.
     117                 :            :  *
     118                 :            :  * Several rules constrain the valid types.  See ovsdb_type_is_valid() (in
     119                 :            :  * ovsdb-types.c) for details.
     120                 :            :  *
     121                 :            :  * If 'value_type' is OVSDB_TYPE_VOID, 'n_min' is 1, and 'n_max' is 1, then the
     122                 :            :  * type is a single atomic 'key_type'.
     123                 :            :  *
     124                 :            :  * If 'value_type' is OVSDB_TYPE_VOID and 'n_min' or 'n_max' (or both) has a
     125                 :            :  * value other than 1, then the type is a set of 'key_type'.  If 'n_min' is 0
     126                 :            :  * and 'n_max' is 1, then the type can also be considered an optional
     127                 :            :  * 'key_type'.
     128                 :            :  *
     129                 :            :  * If 'value_type' is not OVSDB_TYPE_VOID, then the type is a map from
     130                 :            :  * 'key_type' to 'value_type'.  If 'n_min' is 0 and 'n_max' is 1, then the type
     131                 :            :  * can also be considered an optional pair of 'key_type' and 'value_type'.
     132                 :            :  */
     133                 :            : struct ovsdb_type {
     134                 :            :     struct ovsdb_base_type key;
     135                 :            :     struct ovsdb_base_type value;
     136                 :            :     unsigned int n_min;
     137                 :            :     unsigned int n_max;         /* UINT_MAX stands in for "unlimited". */
     138                 :            : };
     139                 :            : 
     140                 :            : #define OVSDB_TYPE_SCALAR_INITIALIZER(KEY) { KEY, OVSDB_BASE_VOID_INIT, 1, 1 }
     141                 :            : 
     142                 :            : extern const struct ovsdb_type ovsdb_type_integer;
     143                 :            : extern const struct ovsdb_type ovsdb_type_real;
     144                 :            : extern const struct ovsdb_type ovsdb_type_boolean;
     145                 :            : extern const struct ovsdb_type ovsdb_type_string;
     146                 :            : extern const struct ovsdb_type ovsdb_type_uuid;
     147                 :            : 
     148                 :            : void ovsdb_type_clone(struct ovsdb_type *, const struct ovsdb_type *);
     149                 :            : void ovsdb_type_destroy(struct ovsdb_type *);
     150                 :            : 
     151                 :            : bool ovsdb_type_is_valid(const struct ovsdb_type *);
     152                 :            : 
     153                 :            : static inline bool ovsdb_type_is_scalar(const struct ovsdb_type *);
     154                 :            : static inline bool ovsdb_type_is_optional(const struct ovsdb_type *);
     155                 :            : static inline bool ovsdb_type_is_optional_scalar(
     156                 :            :     const struct ovsdb_type *);
     157                 :            : static inline bool ovsdb_type_is_composite(const struct ovsdb_type *);
     158                 :            : static inline bool ovsdb_type_is_set(const struct ovsdb_type *);
     159                 :            : static inline bool ovsdb_type_is_map(const struct ovsdb_type *);
     160                 :            : 
     161                 :            : char *ovsdb_type_to_english(const struct ovsdb_type *);
     162                 :            : 
     163                 :            : struct ovsdb_error *ovsdb_type_from_json(struct ovsdb_type *,
     164                 :            :                                          const struct json *)
     165                 :            :     OVS_WARN_UNUSED_RESULT;
     166                 :            : struct json *ovsdb_type_to_json(const struct ovsdb_type *);
     167                 :            : 
     168                 :            : /* Inline function implementations. */
     169                 :            : 
     170                 :            : static inline bool
     171                 :        177 : ovsdb_atomic_type_is_valid(enum ovsdb_atomic_type atomic_type)
     172                 :            : {
     173 [ +  - ][ +  - ]:        177 :     return (int) atomic_type >= 0 && atomic_type < OVSDB_N_TYPES;
     174                 :            : }
     175                 :            : 
     176                 :            : static inline bool
     177                 :    3600837 : ovsdb_base_type_is_ref(const struct ovsdb_base_type *base)
     178                 :            : {
     179 [ +  + ][ +  + ]:    3600837 :     return base->type == OVSDB_TYPE_UUID && base->u.uuid.refTableName;
     180                 :            : }
     181                 :            : 
     182                 :            : static inline bool
     183                 :    1016512 : ovsdb_base_type_is_strong_ref(const struct ovsdb_base_type *base)
     184                 :            : {
     185                 :    2033024 :     return (ovsdb_base_type_is_ref(base)
     186 [ +  + ][ +  + ]:    1016512 :             && base->u.uuid.refType == OVSDB_REF_STRONG);
     187                 :            : }
     188                 :            : 
     189                 :            : static inline bool
     190                 :    2584325 : ovsdb_base_type_is_weak_ref(const struct ovsdb_base_type *base)
     191                 :            : {
     192                 :    5168650 :     return (ovsdb_base_type_is_ref(base)
     193 [ +  + ][ +  + ]:    2584325 :             && base->u.uuid.refType == OVSDB_REF_WEAK);
     194                 :            : }
     195                 :            : 
     196                 :    1177944 : static inline bool ovsdb_type_is_scalar(const struct ovsdb_type *type)
     197                 :            : {
     198                 :    1177944 :     return (type->value.type == OVSDB_TYPE_VOID
     199 [ +  + ][ +  + ]:    1177944 :             && type->n_min == 1 && type->n_max == 1);
                 [ +  + ]
     200                 :            : }
     201                 :            : 
     202                 :            : static inline bool ovsdb_type_is_optional(const struct ovsdb_type *type)
     203                 :            : {
     204                 :            :     return type->n_min == 0;
     205                 :            : }
     206                 :            : 
     207                 :      55760 : static inline bool ovsdb_type_is_optional_scalar(
     208                 :            :     const struct ovsdb_type *type)
     209                 :            : {
     210                 :      55760 :     return (type->value.type == OVSDB_TYPE_VOID
     211 [ +  + ][ +  + ]:      55760 :             && type->n_min == 0 && type->n_max == 1);
                 [ +  + ]
     212                 :            : }
     213                 :            : 
     214                 :      91089 : static inline bool ovsdb_type_is_composite(const struct ovsdb_type *type)
     215                 :            : {
     216                 :      91089 :     return type->n_max > 1;
     217                 :            : }
     218                 :            : 
     219                 :        191 : static inline bool ovsdb_type_is_set(const struct ovsdb_type *type)
     220                 :            : {
     221                 :        191 :     return (type->value.type == OVSDB_TYPE_VOID
     222 [ +  + ][ +  + ]:        191 :             && (type->n_min != 1 || type->n_max != 1));
                 [ +  + ]
     223                 :            : }
     224                 :            : 
     225                 :    1698185 : static inline bool ovsdb_type_is_map(const struct ovsdb_type *type)
     226                 :            : {
     227                 :    1698185 :     return type->value.type != OVSDB_TYPE_VOID;
     228                 :            : }
     229                 :            : 
     230                 :            : #endif /* ovsdb-types.h */

Generated by: LCOV version 1.12