1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 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 PANDA_VERIFICATION_VALUE_VARIABLES_H_ 17 #define PANDA_VERIFICATION_VALUE_VARIABLES_H_ 18 19 #include <memory> 20 21 #include "verification/util/lazy.h" 22 23 #include "runtime/include/mem/panda_containers.h" 24 25 #include "util/str.h" 26 #include "verification/util/obj_pool.h" 27 28 #include "verification/type/type_system_kind.h" 29 30 namespace panda::verifier { 31 32 class Variables { 33 struct Wrapper { InitWrapper34 static void Init(Wrapper &v, size_t idx) 35 { 36 v.Idx_ = idx; 37 } 38 size_t Idx_; 39 }; 40 41 using PoolType = ObjPool<Wrapper, PandaVector, void (*)(Wrapper &, size_t)>; 42 43 public: 44 class Var { 45 public: 46 Var() = default; Var(PoolType::Accessor && a)47 Var(PoolType::Accessor &&a) : accessor {std::move(a)} {} 48 Var(const Var &) = default; 49 Var(Var &&) = default; 50 Var &operator=(const Var &a) = default; 51 Var &operator=(Var &&a) = default; 52 ~Var() = default; 53 54 bool operator==(const Var &v) 55 { 56 return (*accessor).Idx_ == (*v.accessor).Idx_; 57 } 58 59 bool operator!=(const Var &v) 60 { 61 return (*accessor).Idx_ != (*v.accessor).Idx_; 62 } 63 64 template <typename StrT> 65 StrT Image(const char *prefix = "V") const 66 { 67 return StrT {prefix} + NumToStr<StrT>((*accessor).Idx_); 68 } 69 70 private: 71 PoolType::Accessor accessor; 72 }; 73 74 using VarIdx = size_t; 75 76 Variables() = default; Variables(TypeSystemKind)77 Variables(TypeSystemKind) {}; 78 Variables(const Variables &) = default; 79 Variables(Variables &&) = default; 80 Variables &operator=(const Variables &) = default; 81 Variables &operator=(Variables &&) = default; 82 ~Variables() = default; 83 NewVar()84 Var NewVar() 85 { 86 return {VarPool.New()}; 87 } 88 AmountOfUsedVars()89 size_t AmountOfUsedVars() const 90 { 91 return VarPool.Count() - VarPool.FreeCount(); 92 } 93 AllVariables()94 auto AllVariables() 95 { 96 return [fetcher = VarPool.AllObjects()]() mutable -> std::optional<Var> { 97 if (auto v = fetcher()) { 98 return {Var {std::move(*v)}}; 99 } 100 return std::nullopt; 101 }; 102 } 103 104 private: 105 PoolType VarPool {Wrapper::Init}; 106 }; 107 108 } // namespace panda::verifier 109 110 #endif // PANDA_VERIFICATION_VALUE_VARIABLES_H_ 111