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