LCOV - code coverage report
Current view: top level - buildbot/coverage/build/src/context - cdo.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 27 27 100.0 %
Date: 2024-10-06 11:37:27 Functions: 127 141 90.1 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /******************************************************************************
       2                 :            :  * Top contributors (to current version):
       3                 :            :  *   Clark Barrett, Morgan Deters, Tim King
       4                 :            :  *
       5                 :            :  * This file is part of the cvc5 project.
       6                 :            :  *
       7                 :            :  * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS
       8                 :            :  * in the top-level source directory and their institutional affiliations.
       9                 :            :  * All rights reserved.  See the file COPYING in the top-level source
      10                 :            :  * directory for licensing information.
      11                 :            :  * ****************************************************************************
      12                 :            :  *
      13                 :            :  * A context-dependent object.
      14                 :            :  */
      15                 :            : 
      16                 :            : #include "cvc5parser_public.h"
      17                 :            : 
      18                 :            : #ifndef CVC5__CONTEXT__CDO_H
      19                 :            : #define CVC5__CONTEXT__CDO_H
      20                 :            : 
      21                 :            : #include "context/context.h"
      22                 :            : 
      23                 :            : namespace cvc5::context {
      24                 :            : 
      25                 :            : /**
      26                 :            :  * Most basic template for context-dependent objects.  Simply makes a copy
      27                 :            :  * (using the copy constructor) of class T when saving, and copies it back
      28                 :            :  * (using operator=) during restore.
      29                 :            :  */
      30                 :            : template <class T>
      31                 :            : class CDO : public ContextObj {
      32                 :            : 
      33                 :            :   /**
      34                 :            :    * The data of type T being stored in this context-dependent object.
      35                 :            :    */
      36                 :            :   T d_data;
      37                 :            : 
      38                 :            : protected:
      39                 :            : 
      40                 :            :   /**
      41                 :            :    * Copy constructor - it's private to ensure it is only used by save().
      42                 :            :    * Basic CDO objects, cannot be copied-they have to be unique.
      43                 :            :    */
      44                 :  163590992 :   CDO(const CDO<T>& cdo) : ContextObj(cdo), d_data(cdo.d_data) {}
      45                 :            : 
      46                 :            :   /**
      47                 :            :    * operator= for CDO is private to ensure CDO object is not copied.
      48                 :            :    */
      49                 :            :   CDO<T>& operator=(const CDO<T>& cdo) = delete;
      50                 :            : 
      51                 :            :   /**
      52                 :            :    * Implementation of mandatory ContextObj method save: simply copies the
      53                 :            :    * current data to a copy using the copy constructor.  Memory is allocated
      54                 :            :    * using the ContextMemoryManager.
      55                 :            :    */
      56                 :  163590992 :   ContextObj* save(ContextMemoryManager* pCMM) override
      57                 :            :   {
      58                 :  163590992 :     return new (pCMM) CDO<T>(*this);
      59                 :            :   }
      60                 :            : 
      61                 :            :   /**
      62                 :            :    * Implementation of mandatory ContextObj method restore: simply copies the
      63                 :            :    * saved data back from the saved copy using operator= for T.
      64                 :            :    */
      65                 :  163586727 :   void restore(ContextObj* pContextObj) override
      66                 :            :   {
      67                 :  163586727 :     CDO<T>* p = static_cast<CDO<T>*>(pContextObj);
      68                 :  163586727 :     d_data = p->d_data;
      69                 :            :     // Explicitly call destructor as it will not otherwise get called.
      70                 :   43671208 :     p->d_data.~T();
      71                 :  163586727 :   }
      72                 :            : 
      73                 :            : public:
      74                 :            : 
      75                 :            :   /**
      76                 :            :    * Main constructor - uses default constructor for T to create the initial
      77                 :            :    * value of d_data.
      78                 :            :    */
      79                 :    3021923 :   CDO(Context* context) :
      80                 :            :     ContextObj(context),
      81                 :    3021923 :     d_data(T()) {
      82                 :    3021923 :   }
      83                 :            : 
      84                 :            :   /**
      85                 :            :    * Constructor from object of type T.  Creates a ContextObj and sets the data
      86                 :            :    * to the given data value.  Note that this value is only valid in the
      87                 :            :    * current Scope.  If the Scope is popped, the value will revert to whatever
      88                 :            :    * is assigned by the default constructor for T
      89                 :            :    */
      90                 :   13845372 :   CDO(Context* context, const T& data) :
      91                 :            :     ContextObj(context),
      92                 :   13845372 :     d_data(T()) {
      93                 :   13845372 :     makeCurrent();
      94                 :   13845372 :     d_data = data;
      95                 :   13845372 :   }
      96                 :            : 
      97                 :            :   /**
      98                 :            :    * Destructor - call destroy() method
      99                 :            :    */
     100                 :   16782146 :   ~CDO() { destroy(); }
     101                 :            : 
     102                 :            :   /**
     103                 :            :    * Set the data in the CDO.  First call makeCurrent.
     104                 :            :    */
     105                 :  741617476 :   void set(const T& data) {
     106                 :  741617476 :     makeCurrent();
     107                 :  741617476 :     d_data = data;
     108                 :  741617476 :   }
     109                 :            : 
     110                 :            :   /**
     111                 :            :    * Get the current data from the CDO.  Read-only.
     112                 :            :    */
     113                 : 4416777010 :   const T& get() const { return d_data; }
     114                 :            : 
     115                 :            :   /**
     116                 :            :    * For convenience, define operator T() to be the same as get().
     117                 :            :    */
     118                 : 3036554271 :   operator T() { return get(); }
     119                 :            : 
     120                 :            :   /**
     121                 :            :    * For convenience, define operator const T() to be the same as get().
     122                 :            :    */
     123                 :  497921075 :   operator const T() const { return get(); }
     124                 :            : 
     125                 :            :   /**
     126                 :            :    * For convenience, define operator= that takes an object of type T.
     127                 :            :    */
     128                 :  740709031 :   CDO<T>& operator=(const T& data) {
     129                 :  740709031 :     set(data);
     130                 :  740709031 :     return *this;
     131                 :            :   }
     132                 :            : 
     133                 :            : };/* class CDO */
     134                 :            : 
     135                 :            : }  // namespace cvc5::context
     136                 :            : 
     137                 :            : #endif /* CVC5__CONTEXT__CDO_H */

Generated by: LCOV version 1.14