14 #ifndef OR_TOOLS_SAT_MODEL_H_
15 #define OR_TOOLS_SAT_MODEL_H_
23 #include "absl/container/flat_hash_map.h"
45 for (
int i = cleanup_list_.size() - 1; i >= 0; --i) {
46 cleanup_list_[i].reset();
87 T
Get(std::function<T(
const Model&)> f)
const {
105 template <
typename T>
107 const size_t type_id = gtl::FastTypeId<T>();
108 auto find = singletons_.find(type_id);
109 if (find != singletons_.end()) {
110 return static_cast<T*
>(find->second);
115 T* new_t = MyNew<T>(0);
116 singletons_[type_id] = new_t;
126 template <
typename T>
128 return static_cast<const T*
>(
135 template <
typename T>
137 return static_cast<T*
>(
146 template <
typename T>
148 cleanup_list_.emplace_back(
new Delete<T>(t));
156 template <
typename T>
158 T* new_t = MyNew<T>(0);
168 template <
typename T>
170 const size_t type_id = gtl::FastTypeId<T>();
172 singletons_[type_id] = non_owned_class;
175 const std::string&
Name()
const {
return name_; }
183 template <
typename T>
184 decltype(T(
static_cast<Model*
>(
nullptr)))* MyNew(
int) {
187 template <
typename T>
192 const std::string name_;
195 absl::flat_hash_map< size_t,
void*> singletons_;
197 struct DeleteInterface {
198 virtual ~DeleteInterface() =
default;
200 template <
typename T>
201 class Delete :
public DeleteInterface {
203 explicit Delete(T* t) : to_delete_(t) {}
204 ~
Delete()
override =
default;
207 std::unique_ptr<T> to_delete_;
215 std::vector<std::unique_ptr<DeleteInterface>> cleanup_list_;
217 DISALLOW_COPY_AND_ASSIGN(
Model);
223 #endif // OR_TOOLS_SAT_MODEL_H_