LCOV - code coverage report
Current view: top level - root/contrail/src/contrail-common/sandesh/compiler/parse - t_field.h (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 77 93 82.8 %
Date: 2026-08-03 02:19:58 Functions: 18 24 75.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Licensed to the Apache Software Foundation (ASF) under one
       3             :  * or more contributor license agreements. See the NOTICE file
       4             :  * distributed with this work for additional information
       5             :  * regarding copyright ownership. The ASF licenses this file
       6             :  * to you under the Apache License, Version 2.0 (the
       7             :  * "License"); you may not use this file except in compliance
       8             :  * with the License. You may obtain a copy of the License at
       9             :  *
      10             :  *   http://www.apache.org/licenses/LICENSE-2.0
      11             :  *
      12             :  * Unless required by applicable law or agreed to in writing,
      13             :  * software distributed under the License is distributed on an
      14             :  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      15             :  * KIND, either express or implied. See the License for the
      16             :  * specific language governing permissions and limitations
      17             :  * under the License.
      18             :  */
      19             : 
      20             : #ifndef T_FIELD_H
      21             : #define T_FIELD_H
      22             : 
      23             : #include <string>
      24             : #include <sstream>
      25             : 
      26             : #include "t_doc.h"
      27             : 
      28             : // Forward declare for xsd_attrs
      29             : class t_struct;
      30             : 
      31             : /**
      32             :  * Class to represent a field in a thrift structure. A field has a data type,
      33             :  * a symbolic name, and a numeric identifier.
      34             :  *
      35             :  */
      36             : class t_field : public t_doc {
      37             :  public:
      38       13673 :   t_field(t_type* type, std::string name) :
      39       13673 :     type_(type),
      40       13673 :     name_(name),
      41       13673 :     key_(0),
      42             : #ifdef SANDESH
      43       13673 :     req_(T_OPT_IN_REQ_OUT),
      44             : #endif
      45       13673 :     value_(NULL),
      46       13673 :     xsd_optional_(false),
      47       13673 :     xsd_nillable_(false),
      48       13673 :     xsd_attrs_(NULL)
      49             : #ifdef SANDESH
      50       13673 :     , auto_generated_(false)
      51             : #endif
      52       13673 :   {}
      53             : 
      54       88720 :   t_field(t_type* type, std::string name, int32_t key) :
      55       88720 :     type_(type),
      56       88720 :     name_(name),
      57       88720 :     key_(key),
      58       88720 :     req_(T_OPT_IN_REQ_OUT),
      59       88720 :     value_(NULL),
      60       88720 :     xsd_optional_(false),
      61       88720 :     xsd_nillable_(false),
      62       88720 :     xsd_attrs_(NULL)
      63             : #ifdef SANDESH
      64       88720 :     , auto_generated_(false)
      65             : #endif
      66       88720 :   {}
      67             : 
      68             : #ifdef SANDESH
      69       12180 :   t_field(t_type* type, std::string name, int32_t key, bool auto_generated) :
      70       12180 :     type_(type),
      71       12180 :     name_(name),
      72       12180 :     key_(key),
      73       12180 :     req_(T_OPT_IN_REQ_OUT),
      74       12180 :     value_(NULL),
      75       12180 :     xsd_optional_(false),
      76       12180 :     xsd_nillable_(false),
      77       12180 :     xsd_attrs_(NULL),
      78       24360 :     auto_generated_(auto_generated){}
      79             : 
      80        4326 :   static std::string auto_string_name(int32_t key) {
      81        4326 :       std::string str;
      82             :       char buf[20];
      83        4326 :       snprintf(buf, 20, "str%d", key);
      84        4326 :       str = buf;
      85        8652 :       return str;
      86           0 :   }
      87             : #endif
      88             : 
      89       13673 :   virtual ~t_field() {}
      90             : 
      91      619343 :   t_type* get_type() const {
      92      619343 :     return type_;
      93             :   }
      94             : 
      95      780503 :   const std::string& get_name() const {
      96      780503 :     return name_;
      97             :   }
      98             : 
      99      504257 :   int32_t get_key() const {
     100      504257 :     return key_;
     101             :   }
     102             : 
     103             :   enum e_req {
     104             :     T_REQUIRED,
     105             :     T_OPTIONAL,
     106             :     T_OPT_IN_REQ_OUT
     107             :   };
     108             : 
     109       88720 :   void set_req(e_req req) {
     110       88720 :     req_ = req;
     111       88720 :   }
     112             : 
     113      421837 :   e_req get_req() const {
     114      421837 :     return req_;
     115             :   }
     116             : 
     117        4494 :   void set_value(t_const_value* value) {
     118        4494 :     value_ = value;
     119        4494 :   }
     120             : 
     121       29897 :   t_const_value* get_value() {
     122       29897 :     return value_;
     123             :   }
     124             : 
     125       84394 :   void set_xsd_optional(bool xsd_optional) {
     126       84394 :     xsd_optional_ = xsd_optional;
     127       84394 :   }
     128             : 
     129           0 :   bool get_xsd_optional() const {
     130           0 :     return xsd_optional_;
     131             :   }
     132             : 
     133       84394 :   void set_xsd_nillable(bool xsd_nillable) {
     134       84394 :     xsd_nillable_ = xsd_nillable;
     135       84394 :   }
     136             : 
     137           0 :   bool get_xsd_nillable() const {
     138           0 :     return xsd_nillable_;
     139             :   }
     140             : 
     141           0 :   void set_xsd_attrs(t_struct* xsd_attrs) {
     142           0 :     xsd_attrs_ = xsd_attrs;
     143           0 :   }
     144             : 
     145           0 :   t_struct* get_xsd_attrs() {
     146           0 :     return xsd_attrs_;
     147             :   }
     148             : 
     149             : #ifdef SANDESH
     150      104070 :   bool get_auto_generated() const {
     151      104070 :     return auto_generated_;
     152             :   }
     153             : 
     154             :   void set_auto_generated(bool auto_generated) {
     155             :     auto_generated_ = auto_generated;
     156             :   }
     157             : #endif
     158             : 
     159             :   // This is not the same function as t_type::get_fingerprint_material,
     160             :   // but it does the same thing.
     161      181952 :   std::string get_fingerprint_material() const {
     162      181952 :     std::ostringstream keystm;
     163      181952 :     keystm << key_;
     164      363904 :     return keystm.str() + ":" +
     165      181952 :       ((req_ == T_OPTIONAL) ? "opt-" : "") +
     166      727808 :       type_->get_fingerprint_material();
     167      181952 :   }
     168             : 
     169             :   /**
     170             :    * Comparator to sort fields in ascending order by key.
     171             :    * Make this a functor instead of a function to help GCC inline it.
     172             :    * The arguments are (const) references to const pointers to const t_fields.
     173             :    */
     174             :   struct key_compare {
     175      219180 :     bool operator()(t_field const * const & a, t_field const * const & b) const {
     176      219180 :       return a->get_key() < b->get_key();
     177             :     }
     178             :   };
     179             : 
     180             : #ifdef SANDESH
     181       11277 :   virtual bool has_key_annotation() const {
     182       11277 :     std::map<std::string, std::string>::const_iterator it;
     183       11277 :     it = annotations_.find("key");
     184       11277 :     if (it != annotations_.end()) {
     185         765 :       return true;
     186             :     }
     187       10512 :     return false;
     188             :   }
     189           0 :   virtual bool has_hidden_annotation() const {
     190           0 :     std::map<std::string, std::string>::const_iterator it;
     191           0 :     it = annotations_.find("hidden");
     192           0 :     if (it != annotations_.end()) {
     193           0 :       return true;
     194             :     }
     195           0 :     return false;
     196             :   }
     197             : #endif
     198             : 
     199             :   std::map<std::string, std::string> annotations_;
     200             : 
     201             :  private:
     202             :   t_type* type_;
     203             :   std::string name_;
     204             :   int32_t key_;
     205             :   e_req req_;
     206             :   t_const_value* value_;
     207             : 
     208             :   bool xsd_optional_;
     209             :   bool xsd_nillable_;
     210             :   t_struct* xsd_attrs_;
     211             : #ifdef SANDESH
     212             :   bool auto_generated_;
     213             : #endif
     214             : 
     215             : };
     216             : 
     217             : /**
     218             :  * A simple struct for the parser to use to store a field ID, and whether or
     219             :  * not it was specified by the user or automatically chosen.
     220             :  */
     221             : struct t_field_id {
     222             :   int64_t value;
     223             :   bool auto_assigned;
     224             : };
     225             : 
     226             : #endif

Generated by: LCOV version 1.14