@@ -149,6 +149,7 @@ class ByRef
149149
150150 const T& Get () const {return *m_val;}
151151 T& Get () {return *const_cast <T*>(m_val);}
152+ bool ShouldExtendLifetime () const {return false ;}
152153private:
153154 const T* m_val;
154155};
@@ -166,10 +167,29 @@ class ByVal
166167
167168 const T& Get () const {return m_val;}
168169 T& Get () {return m_val;}
170+ bool ShouldExtendLifetime () const {return false ;}
169171private:
170172 T m_val;
171173};
172174
175+ template <typename T>
176+ class BySharedVal
177+ {
178+ public:
179+ BySharedVal (T&& val)
180+ : m_val(std::make_shared<T>(std::move(val)))
181+ {}
182+ ~BySharedVal ()
183+ {
184+ }
185+
186+ const T& Get () const {return *m_val;}
187+ T& Get () {return *m_val;}
188+ bool ShouldExtendLifetime () const {return true ;}
189+ private:
190+ std::shared_ptr<T> m_val;
191+ };
192+
173193template <template <typename > class Holder >
174194class GenericListAdapter : public IListAccessor
175195{
@@ -183,6 +203,7 @@ class GenericListAdapter : public IListAccessor
183203 const auto & val = m_values.Get ().GetValueByIndex (idx);
184204 return visit (visitors::InputValueConvertor (true ), val.data ()).get ();
185205 }
206+ bool ShouldExtendLifetime () const override {return m_values.ShouldExtendLifetime ();}
186207private:
187208 Holder<GenericList> m_values;
188209};
@@ -200,6 +221,7 @@ class ValuesListAdapter : public IListAccessor
200221 const auto & val = m_values.Get ()[idx];
201222 return visit (visitors::InputValueConvertor (false ), val.data ()).get ();
202223 }
224+ bool ShouldExtendLifetime () const override {return m_values.ShouldExtendLifetime ();}
203225private:
204226 Holder<ValuesList> m_values;
205227};
@@ -214,6 +236,7 @@ ListAdapter ListAdapter::CreateAdapter(InternalValueList&& values)
214236
215237 size_t GetSize () const override {return m_values.size ();}
216238 InternalValue GetValueByIndex (int64_t idx) const override {return m_values[static_cast <size_t >(idx)];}
239+ bool ShouldExtendLifetime () const override {return false ;}
217240 private:
218241 InternalValueList m_values;
219242 };
@@ -233,12 +256,12 @@ ListAdapter ListAdapter::CreateAdapter(const ValuesList& values)
233256
234257ListAdapter ListAdapter::CreateAdapter (GenericList&& values)
235258{
236- return ListAdapter ([accessor = GenericListAdapter<ByVal >(std::move (values))]() {return &accessor;});
259+ return ListAdapter ([accessor = GenericListAdapter<BySharedVal >(std::move (values))]() {return &accessor;});
237260}
238261
239262ListAdapter ListAdapter::CreateAdapter (ValuesList&& values)
240263{
241- return ListAdapter ([accessor = ValuesListAdapter<ByVal >(std::move (values))]() {return &accessor;});
264+ return ListAdapter ([accessor = ValuesListAdapter<BySharedVal >(std::move (values))]() {return &accessor;});
242265}
243266
244267template <template <typename > class Holder >
@@ -253,6 +276,7 @@ class SubscriptedListAdapter : public IListAccessor
253276 {
254277 return Subscript (m_values.Get ().GetValueByIndex (idx), m_subscript);
255278 }
279+ bool ShouldExtendLifetime () const override {return m_values.ShouldExtendLifetime ();}
256280private:
257281 Holder<ListAdapter> m_values;
258282 InternalValue m_subscript;
@@ -264,7 +288,7 @@ ListAdapter ListAdapter::ToSubscriptedList(const InternalValue& subscript, bool
264288 return ListAdapter ([accessor = SubscriptedListAdapter<ByRef>(*this , subscript)]() {return &accessor;});
265289
266290 ListAdapter tmp (*this );
267- return ListAdapter ([accessor = SubscriptedListAdapter<ByVal >(std::move (tmp), subscript)]() {return &accessor;});
291+ return ListAdapter ([accessor = SubscriptedListAdapter<BySharedVal >(std::move (tmp), subscript)]() {return &accessor;});
268292}
269293
270294InternalValueList ListAdapter::ToValueList () const
@@ -325,6 +349,7 @@ class InternalValueMapAdapter : public IMapAccessor
325349 }
326350 return false ;
327351 }
352+ bool ShouldExtendLifetime () const override {return m_values.ShouldExtendLifetime ();}
328353private:
329354 Holder<InternalValueMap> m_values;
330355};
@@ -380,7 +405,7 @@ class GenericMapAdapter : public IMapAccessor
380405 {
381406 return m_values.Get ().GetKeys ();
382407 }
383-
408+ bool ShouldExtendLifetime () const override { return m_values. ShouldExtendLifetime ();}
384409
385410private:
386411 Holder<GenericMap> m_values;
@@ -428,6 +453,7 @@ class ValuesMapAdapter : public IMapAccessor
428453
429454 return result;
430455 }
456+ bool ShouldExtendLifetime () const override {return m_values.ShouldExtendLifetime ();}
431457private:
432458 Holder<ValuesMap> m_values;
433459};
@@ -450,7 +476,7 @@ MapAdapter MapAdapter::CreateAdapter(const GenericMap& values)
450476
451477MapAdapter MapAdapter::CreateAdapter (GenericMap&& values)
452478{
453- return MapAdapter ([accessor = GenericMapAdapter<ByVal >(std::move (values))]() mutable {return &accessor;});
479+ return MapAdapter ([accessor = GenericMapAdapter<BySharedVal >(std::move (values))]() mutable {return &accessor;});
454480}
455481
456482MapAdapter MapAdapter::CreateAdapter (const ValuesMap& values)
@@ -460,7 +486,7 @@ MapAdapter MapAdapter::CreateAdapter(const ValuesMap& values)
460486
461487MapAdapter MapAdapter::CreateAdapter (ValuesMap&& values)
462488{
463- return MapAdapter ([accessor = ValuesMapAdapter<ByVal >(std::move (values))]() mutable {return &accessor;});
489+ return MapAdapter ([accessor = ValuesMapAdapter<BySharedVal >(std::move (values))]() mutable {return &accessor;});
464490}
465491
466492} // jinja2
0 commit comments