OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::UndoRedo::ImmutableObjectHistory< T > Class Template Reference
Inheritance diagram for Slic3r::UndoRedo::ImmutableObjectHistory< T >:
Collaboration diagram for Slic3r::UndoRedo::ImmutableObjectHistory< T >:

Public Member Functions

 ImmutableObjectHistory (std::shared_ptr< const T > shared_object, bool optional)
 ~ImmutableObjectHistory () override
bool is_mutable () const override
bool is_immutable () const override
bool is_optional () const override
const void * immutable_object_ptr () const override
size_t memsize () const override
void save (size_t active_snapshot_time, size_t current_time)
bool has_snapshot (size_t timestamp)
size_t release_optional () override
void restore_optional () override
bool is_serialized () const
const std::string & serialized_data () const
std::shared_ptr< const T > & shared_ptr (StackImpl &stack)
bool valid () override
bool empty () override
size_t release_before_timestamp (size_t timestamp) override
size_t release_after_timestamp (size_t timestamp) override
size_t release_between_timestamps (size_t timestamp_start, size_t timestamp_end) override

Protected Attributes

std::vector< Interval > m_history

Private Attributes

std::shared_ptr< const T > m_shared_object
bool m_optional
std::string m_serialized

Detailed Description

template<typename T>
class Slic3r::UndoRedo::ImmutableObjectHistory< T >

Constructor & Destructor Documentation

◆ ImmutableObjectHistory()

template<typename T>
Slic3r::UndoRedo::ImmutableObjectHistory< T >::ImmutableObjectHistory ( std::shared_ptr< const T > shared_object,
bool optional )
inline
Definition UndoRedo.cpp:243
bool m_optional
Definition UndoRedo.cpp:344
std::shared_ptr< const T > m_shared_object
Definition UndoRedo.cpp:342

References m_optional, and m_shared_object.

◆ ~ImmutableObjectHistory()

template<typename T>
Slic3r::UndoRedo::ImmutableObjectHistory< T >::~ImmutableObjectHistory ( )
inlineoverride
246{}

Member Function Documentation

◆ empty()

bool Slic3r::UndoRedo::ObjectHistory< Interval >::empty ( )
inlineoverridevirtualinherited

Implements Slic3r::UndoRedo::ObjectHistoryBase.

147{ return m_history.empty(); }
Definition UndoRedo.cpp:142
bool empty() override
Definition UndoRedo.cpp:147

◆ has_snapshot()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::has_snapshot ( size_t timestamp)
inline
276 {
277 if (m_history.empty())
278 return false;
280 if (it == m_history.end() || it->begin() > timestamp) {
281 if (it == m_history.begin())
282 return false;
283 -- it;
284 }
285 return timestamp >= it->begin() && timestamp < it->end();
286 }
std::vector< Interval > m_history
Definition UndoRedo.cpp:228

References Slic3r::UndoRedo::ObjectHistory< Interval >::m_history.

◆ immutable_object_ptr()

template<typename T>
const void * Slic3r::UndoRedo::ImmutableObjectHistory< T >::immutable_object_ptr ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::UndoRedo::ObjectHistoryBase.

252{ return (const void*)m_shared_object.get(); }

References m_shared_object.

◆ is_immutable()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::is_immutable ( ) const
inlineoverridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

249{ return true; }

◆ is_mutable()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::is_mutable ( ) const
inlineoverridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

248{ return false; }

◆ is_optional()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::is_optional ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::UndoRedo::ObjectHistoryBase.

250{ return m_optional; }

References m_optional.

◆ is_serialized()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::is_serialized ( ) const
inline
319{ return m_shared_object.get() == nullptr; }

References m_shared_object.

Referenced by memsize(), and release_optional().

Here is the caller graph for this function:

◆ memsize()

template<typename T>
size_t Slic3r::UndoRedo::ImmutableObjectHistory< T >::memsize ( ) const
inlineoverridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

255 {
256 size_t memsize = sizeof(*this);
257 if (this->is_serialized())
258 memsize += m_serialized.size();
259 else if (m_shared_object.use_count() == 1)
260 // Only count the shared object's memsize into the total Undo / Redo stack memsize if it is referenced from the Undo / Redo stack only.
261 memsize += m_shared_object->memsize();
262 memsize += m_history.size() * sizeof(Interval);
263 return memsize;
264 }
std::string m_serialized
Definition UndoRedo.cpp:345
size_t memsize() const override
Definition UndoRedo.cpp:255
bool is_serialized() const
Definition UndoRedo.cpp:319

References is_serialized(), Slic3r::UndoRedo::ObjectHistory< Interval >::m_history, m_serialized, m_shared_object, and memsize().

Referenced by memsize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ release_after_timestamp()

size_t Slic3r::UndoRedo::ObjectHistory< Interval >::release_after_timestamp ( size_t timestamp)
inlineoverridevirtualinherited

Implements Slic3r::UndoRedo::ObjectHistoryBase.

178 {
179 size_t mem_released = 0;
180 if (! m_history.empty()) {
181 assert(this->valid());
182 // it points to an interval which either starts with timestamp, or follows the timestamp.
183 auto it = std::lower_bound(m_history.begin(), m_history.end(), T(timestamp, timestamp));
184 if (it != m_history.begin()) {
185 auto it_prev = it;
186 -- it_prev;
187 assert(it_prev->begin() < timestamp);
188 // Trim the last interval with timestamp.
189 it_prev->trim_end(timestamp);
190 }
191 for (auto it2 = it; it2 != m_history.end(); ++ it2)
193 m_history.erase(it, m_history.end());
194 assert(this->valid());
195 }
196 return mem_released;
197 }
virtual size_t memsize() const =0

◆ release_before_timestamp()

size_t Slic3r::UndoRedo::ObjectHistory< Interval >::release_before_timestamp ( size_t timestamp)
inlineoverridevirtualinherited

Implements Slic3r::UndoRedo::ObjectHistoryBase.

150 {
151 size_t mem_released = 0;
152 if (! m_history.empty()) {
153 assert(this->valid());
154 // it points to an interval which either starts with timestamp, or follows the timestamp.
155 auto it = std::lower_bound(m_history.begin(), m_history.end(), T(timestamp, timestamp));
156 // Find the first iterator with begin() < timestamp.
157 if (it == m_history.end())
158 -- it;
159 while (it != m_history.begin() && it->begin() >= timestamp)
160 -- it;
161 if (it->begin() < timestamp && it->end() > timestamp) {
162 it->trim_begin(timestamp);
163 if (it != m_history.begin())
164 -- it;
165 }
166 if (it->end() <= timestamp) {
167 auto it_end = ++ it;
168 for (it = m_history.begin(); it != it_end; ++ it)
169 mem_released += it->memsize();
170 m_history.erase(m_history.begin(), it_end);
171 }
172 assert(this->valid());
173 }
174 return mem_released;
175 }

◆ release_between_timestamps()

size_t Slic3r::UndoRedo::ObjectHistory< Interval >::release_between_timestamps ( size_t timestamp_start,
size_t timestamp_end )
inlineoverridevirtualinherited

Implements Slic3r::UndoRedo::ObjectHistoryBase.

202 {
203 size_t mem_released = 0;
204 if (! m_history.empty()) {
205 assert(this->valid());
206 // Find the span of m_history intervals that are fully in (timestamp_start, timestamp_end>, thus they will be never
207 // deserialized for any snapshot in <timestamp_start, timestamp_end).
208 auto it_lo = std::upper_bound(m_history.begin(), m_history.end(), timestamp_start, [](size_t l, const auto &r) { return l < r.begin(); });
209 auto it_hi = std::upper_bound(it_lo, m_history.end(), timestamp_end, [](size_t l, const auto &r) { return l < r.end(); });
210 if (it_lo != it_hi) {
211 // There are some intervals that start inside (timestamp_start, timestamp_end), that could be released.
212 assert(it_lo->begin() > timestamp_start && it_lo->end() <= timestamp_end);
213 assert(it_hi == m_history.end() || (it_hi->begin() > it_lo->begin() && it_hi->end() > timestamp_end));
214 if (it_lo != m_history.begin() && it_hi != m_history.end()) {
215 // One may consider merging the two intervals.
216 //FIXME merge them.
217 }
218 for (auto it = it_lo; it != it_hi; ++ it)
219 mem_released += it->memsize();
220 m_history.erase(it_lo, it_hi);
221 }
222 assert(this->valid());
223 }
224 return mem_released;
225 }

◆ release_optional()

template<typename T>
size_t Slic3r::UndoRedo::ImmutableObjectHistory< T >::release_optional ( )
inlineoverridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

289 {
290 size_t mem_released = 0;
291 if (m_optional) {
292 bool released = false;
293 if (this->is_serialized()) {
294 mem_released += m_serialized.size();
295 m_serialized.clear();
296 released = true;
297 } else if (m_shared_object.use_count() == 1) {
298 mem_released += m_shared_object->memsize();
299 m_shared_object.reset();
300 released = true;
301 }
302 if (released) {
303 mem_released += m_history.size() * sizeof(Interval);
304 m_history.clear();
305 }
306 } else if (m_shared_object.use_count() == 1) {
307 // The object is in memory, but it is not shared with the scene. Let the object decide whether there is any optional data to release.
308 const_cast<T*>(m_shared_object.get())->release_optional();
309 }
310 return mem_released;
311 }
size_t release_optional() override
Definition UndoRedo.cpp:289

References is_serialized(), Slic3r::UndoRedo::ObjectHistory< Interval >::m_history, m_optional, m_serialized, and m_shared_object.

Here is the call graph for this function:

◆ restore_optional()

template<typename T>
void Slic3r::UndoRedo::ImmutableObjectHistory< T >::restore_optional ( )
inlineoverridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

314 {
315 if (m_shared_object.use_count() == 1)
316 const_cast<T*>(m_shared_object.get())->restore_optional();
317 }
void restore_optional() override
Definition UndoRedo.cpp:314

References m_shared_object.

◆ save()

template<typename T>
void Slic3r::UndoRedo::ImmutableObjectHistory< T >::save ( size_t active_snapshot_time,
size_t current_time )
inline
266 {
267 assert(m_history.empty() || m_history.back().end() <= active_snapshot_time ||
268 // The snapshot of an immutable object may have already been taken from another mutable object.
269 (m_history.back().begin() <= active_snapshot_time && m_history.back().end() == current_time + 1));
270 if (m_history.empty() || m_history.back().end() < active_snapshot_time)
272 else
273 m_history.back().extend_end(current_time + 1);
274 }

References Slic3r::UndoRedo::ObjectHistory< Interval >::m_history.

Referenced by Slic3r::UndoRedo::StackImpl::save_immutable_object().

Here is the caller graph for this function:

◆ serialized_data()

template<typename T>
const std::string & Slic3r::UndoRedo::ImmutableObjectHistory< T >::serialized_data ( ) const
inline
320{ return m_serialized; }

References m_serialized.

◆ shared_ptr()

template<typename T>
std::shared_ptr< const T > & Slic3r::UndoRedo::ImmutableObjectHistory< T >::shared_ptr ( StackImpl & stack)
828{
829 if (m_shared_object.get() == nullptr && ! m_serialized.empty()) {
830 // Deserialize the object.
832 {
834 typedef typename std::remove_const<T>::type Type;
836 archive(*mesh.get());
838 }
839 }
840 return m_shared_object;
841}
Type
Definition CustomGCode.hpp:18

References m_serialized, and m_shared_object.

◆ valid()

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::valid ( )
overridevirtual

Implements Slic3r::UndoRedo::ObjectHistoryBase.

523{
524 // The immutable object content is captured either by a shared object, or by its serialization, but not both.
525 assert(! m_shared_object == ! m_serialized.empty());
526 // Verify that the history intervals are sorted and do not overlap.
527 if (! m_history.empty())
528 for (size_t i = 1; i < m_history.size(); ++ i)
530 return true;
531}

References Slic3r::UndoRedo::ObjectHistory< Interval >::m_history, m_serialized, and m_shared_object.

Member Data Documentation

◆ m_history

◆ m_optional

template<typename T>
bool Slic3r::UndoRedo::ImmutableObjectHistory< T >::m_optional
private

◆ m_serialized

template<typename T>
std::string Slic3r::UndoRedo::ImmutableObjectHistory< T >::m_serialized
private

◆ m_shared_object

template<typename T>
std::shared_ptr<const T> Slic3r::UndoRedo::ImmutableObjectHistory< T >::m_shared_object
private

The documentation for this class was generated from the following file:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/Utils/UndoRedo.cpp