Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * 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 : : * A context-dependent "maybe" template type 13 : : * 14 : : * This implements a CDMaybe. 15 : : * This has either been set in the context or it has not. 16 : : * Template parameter T must have a default constructor and support 17 : : * assignment. 18 : : */ 19 : : 20 : : #include "cvc5_private.h" 21 : : 22 : : #pragma once 23 : : 24 : : #include "context/cdo.h" 25 : : #include "context/context.h" 26 : : 27 : : namespace cvc5::context { 28 : : 29 : : class CDRaised { 30 : : private: 31 : : context::CDO<bool> d_flag; 32 : : 33 : : public: 34 : 50019 : CDRaised(context::Context* c) 35 : 50019 : : d_flag(c, false) 36 : 50019 : {} 37 : : 38 : : 39 : 1523660 : bool isRaised() const { 40 : 1523660 : return d_flag.get(); 41 : : } 42 : : 43 : 3439 : void raise(){ 44 [ - + ][ - + ]: 3439 : Assert(!isRaised()); [ - - ] 45 : 3439 : d_flag.set(true); 46 : 3439 : } 47 : : 48 : : };/* class CDRaised */ 49 : : 50 : : template <class T> 51 : : class CDMaybe { 52 : : private: 53 : : typedef std::pair<bool, T> BoolTPair; 54 : : context::CDO<BoolTPair> d_data; 55 : : 56 : : public: 57 : 50019 : CDMaybe(context::Context* c) : d_data(c, std::make_pair(false, T())) 58 : 50019 : {} 59 : : 60 : 1294560 : bool isSet() const { 61 : 1294560 : return d_data.get().first; 62 : : } 63 : : 64 : 1917 : void set(const T& d){ 65 [ - + ][ - + ]: 1917 : Assert(!isSet()); [ - - ] 66 : 1917 : d_data.set(std::make_pair(true, d)); 67 : 1917 : } 68 : : 69 : 1917 : const T& get() const{ 70 [ - + ][ - + ]: 1917 : Assert(isSet()); [ - - ] 71 : 1917 : return d_data.get().second; 72 : : } 73 : : };/* class CDMaybe<T> */ 74 : : 75 : : } // namespace cvc5::context