Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds 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 : : * Function array constant, which is an almost constant function 14 : : */ 15 : : 16 : : #include "expr/function_array_const.h" 17 : : 18 : : #include <iostream> 19 : : 20 : : #include "base/check.h" 21 : : #include "expr/node.h" 22 : : #include "expr/type_node.h" 23 : : 24 : : using namespace std; 25 : : 26 : : namespace cvc5::internal { 27 : : 28 : 13992 : bool isFunctionCompatibleWithArray(const TypeNode& ftype, const TypeNode& atype) 29 : : { 30 [ - + ]: 13992 : if (!ftype.isFunction()) 31 : : { 32 : 0 : return false; 33 : : } 34 : 27984 : std::vector<TypeNode> argTypes = ftype.getArgTypes(); 35 : 27984 : TypeNode atc = atype; 36 [ + + ]: 34480 : for (size_t i = 0, nargs = argTypes.size(); i < nargs; i++) 37 : : { 38 [ + - ][ - + ]: 20488 : if (!atc.isArray() || argTypes[i] != atc.getArrayIndexType()) [ + - ][ - + ] [ - - ] 39 : : { 40 : 0 : return false; 41 : : } 42 : 20488 : atc = atc.getArrayConstituentType(); 43 : : } 44 : 13992 : return true; 45 : : } 46 : : 47 : 13992 : FunctionArrayConst::FunctionArrayConst(const TypeNode& type, const Node& avalue) 48 : 13992 : : d_type(), d_avalue() 49 : : { 50 [ - + ][ - + ]: 13992 : Assert(avalue.isConst()); [ - - ] 51 [ - + ][ - + ]: 13992 : Assert(avalue.getType().isArray()); [ - - ] 52 [ - + ][ - + ]: 13992 : Assert(isFunctionCompatibleWithArray(type, avalue.getType())); [ - - ] 53 : : 54 : 13992 : d_type.reset(new TypeNode(type)); 55 : 13992 : d_avalue.reset(new Node(avalue)); 56 : 13992 : } 57 : : 58 : 6542 : FunctionArrayConst::FunctionArrayConst(const FunctionArrayConst& other) 59 : 6542 : : d_type(new TypeNode(other.getType())), 60 : 13084 : d_avalue(new Node(other.getArrayValue())) 61 : : { 62 : 6542 : } 63 : : 64 : 20534 : FunctionArrayConst::~FunctionArrayConst() {} 65 : 0 : FunctionArrayConst& FunctionArrayConst::operator=( 66 : : const FunctionArrayConst& other) 67 : : { 68 : 0 : (*d_type) = other.getType(); 69 : 0 : (*d_avalue) = other.getArrayValue(); 70 : 0 : return *this; 71 : : } 72 : : 73 : 104641 : const TypeNode& FunctionArrayConst::getType() const { return *d_type; } 74 : : 75 : 92878 : const Node& FunctionArrayConst::getArrayValue() const { return *d_avalue; } 76 : : 77 : 20534 : bool FunctionArrayConst::operator==(const FunctionArrayConst& fc) const 78 : : { 79 [ + - ][ + - ]: 20534 : return getType() == fc.getType() && getArrayValue() == fc.getArrayValue(); 80 : : } 81 : : 82 : 0 : bool FunctionArrayConst::operator!=(const FunctionArrayConst& fc) const 83 : : { 84 : 0 : return !(*this == fc); 85 : : } 86 : : 87 : 0 : bool FunctionArrayConst::operator<(const FunctionArrayConst& fc) const 88 : : { 89 : 0 : return (getType() < fc.getType()) 90 [ - - ][ - - ]: 0 : || (getType() == fc.getType() && getArrayValue() < fc.getArrayValue()); [ - - ] 91 : : } 92 : : 93 : 0 : bool FunctionArrayConst::operator<=(const FunctionArrayConst& fc) const 94 : : { 95 : 0 : return (getType() < fc.getType()) 96 [ - - ][ - - ]: 0 : || (getType() == fc.getType() 97 [ - - ]: 0 : && getArrayValue() <= fc.getArrayValue()); 98 : : } 99 : : 100 : 0 : bool FunctionArrayConst::operator>(const FunctionArrayConst& fc) const 101 : : { 102 : 0 : return !(*this <= fc); 103 : : } 104 : : 105 : 0 : bool FunctionArrayConst::operator>=(const FunctionArrayConst& fc) const 106 : : { 107 : 0 : return !(*this < fc); 108 : : } 109 : : 110 : 0 : std::ostream& operator<<(std::ostream& out, const FunctionArrayConst& fc) 111 : : { 112 : 0 : return out << "__function_constant(" << fc.getType() << ", " 113 : 0 : << fc.getArrayValue() << ')'; 114 : : } 115 : : 116 : 40160 : size_t FunctionArrayConstHashFunction::operator()( 117 : : const FunctionArrayConst& fc) const 118 : : { 119 : 40160 : return std::hash<TypeNode>()(fc.getType()) 120 : 40160 : * std::hash<Node>()(fc.getArrayValue()); 121 : : } 122 : : 123 : : } // namespace cvc5::internal