[Bf-blender-cvs] [56e2b9901da] gpencil-new-data-proposal: Use GPFrameKey instead of std::pair for frame ordering

Falk David noreply at git.blender.org
Mon Nov 28 23:41:25 CET 2022


Commit: 56e2b9901dad54b1de5c6257ab5e82e481faf192
Author: Falk David
Date:   Mon Nov 28 22:17:12 2022 +0100
Branches: gpencil-new-data-proposal
https://developer.blender.org/rB56e2b9901dad54b1de5c6257ab5e82e481faf192

Use GPFrameKey instead of std::pair for frame ordering

===================================================================

M	source/blender/blenkernel/intern/gpencil_new_proposal.cc
M	source/blender/blenkernel/intern/gpencil_new_proposal.hh

===================================================================

diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal.cc b/source/blender/blenkernel/intern/gpencil_new_proposal.cc
index e424cd32d37..bf9911b3638 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal.cc
@@ -138,20 +138,17 @@ GPFrame::~GPFrame()
   this->strokes = nullptr;
 }
 
-bool GPFrame::operator<(const GPFrame &other) const
+bool GPFrame::operator<(const GPFrameKey key) const
 {
-  if (this->start_time == other.start_time) {
-    return this->layer_index < other.layer_index;
+  if (this->start_time == key.start_time) {
+    return this->layer_index < key.layer_index;
   }
-  return this->start_time < other.start_time;
+  return this->start_time < key.start_time;
 }
 
-bool GPFrame::operator<(const std::pair<int, int> elem) const
+bool GPFrame::operator<(const GPFrame &other) const
 {
-  if (this->start_time == elem.second) {
-    return this->layer_index < elem.first;
-  }
-  return this->start_time < elem.second;
+  return *this < other.get_frame_key();
 }
 
 bool GPFrame::operator==(const GPFrame &other) const
@@ -606,15 +603,14 @@ int GPData::add_frame_on_layer_initialized(int layer_index, int frame_start, int
 
   /* Check if the frame can be appended at the end. */
   if (this->frames_size == 0 || this->frames_size == reserved ||
-      this->frames(last_index) < std::pair<int, int>(layer_index, frame_start)) {
+      this->frames(last_index) < new_frame.get_frame_key()) {
     this->frames_for_write(last_index + 1) = std::move(new_frame);
     return last_index + 1;
   }
 
   /* Look for the first frame that is equal or greater than the new frame. */
-  auto it = std::lower_bound(this->frames().begin(),
-                             this->frames().drop_back(reserved).end(),
-                             std::pair<int, int>(layer_index, frame_start));
+  auto it = std::lower_bound(
+      this->frames().begin(), this->frames().drop_back(reserved).end(), new_frame.get_frame_key());
   /* Get the index of the frame. */
   int index = std::distance(this->frames().begin(), it);
   /* Move all the frames and make space at index. */
diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal.hh b/source/blender/blenkernel/intern/gpencil_new_proposal.hh
index c8414713353..ed859e83ad9 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal.hh
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal.hh
@@ -81,7 +81,7 @@ typedef struct GPFrame {
   CurvesGeometry *strokes;
 
   /**
-   * The frame flag (see `eGPFrameFlag`). 
+   * The frame flag (see `eGPFrameFlag`).
    */
   int flag;
 
@@ -219,6 +219,13 @@ class GPStroke {
 };
 
 class GPFrame : public ::GPFrame {
+
+  /** Structure that defines a key for a frame. Used for ordering/sorting. */
+  struct GPFrameKey {
+    int layer_index;
+    int start_time;
+  };
+
  public:
   GPFrame() : GPFrame(-1, -1)
   {
@@ -237,9 +244,8 @@ class GPFrame : public ::GPFrame {
 
   ~GPFrame();
 
+  bool operator<(const GPFrameKey key) const;
   bool operator<(const GPFrame &other) const;
-  /* Assumes that elem.first is the layer index and elem.second is the start time. */
-  bool operator<(const std::pair<int, int> elem) const;
 
   bool operator==(const GPFrame &other) const;
 
@@ -250,6 +256,11 @@ class GPFrame : public ::GPFrame {
 
   Vector<GPStroke> strokes_for_write();
   GPStroke add_new_stroke(int new_points_num);
+
+  constexpr GPFrameKey get_frame_key() const
+  {
+    return {layer_index, start_time};
+  };
 };
 
 class GPLayer : public ::GPLayer {



More information about the Bf-blender-cvs mailing list