[Bf-blender-cvs] [9e437aabdb3] master: Cleanup: fix compiling with older compiler on macos

Jacques Lucke noreply at git.blender.org
Sun Mar 21 14:29:33 CET 2021


Commit: 9e437aabdb3d14c32584afb4bfa9e6eb35f06e51
Author: Jacques Lucke
Date:   Sun Mar 21 14:29:26 2021 +0100
Branches: master
https://developer.blender.org/rB9e437aabdb3d14c32584afb4bfa9e6eb35f06e51

Cleanup: fix compiling with older compiler on macos

We cannot use `std::variant` yet, because not all of the compilers
we support have a working version of it yet. For now, I just replaced
it with multiple `std::option` which is good enough, because currently
`CellValue` is only used for the cells that are actually drawn in
the spreadsheet.

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

M	source/blender/editors/space_spreadsheet/spreadsheet_column_layout.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_column_layout.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc

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

diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.cc b/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.cc
index 00724ffd4b0..46760c0dd4e 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.cc
@@ -118,8 +118,8 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
     CellValue cell_value;
     column.get_value(real_index, cell_value);
 
-    if (std::holds_alternative<int>(cell_value.value)) {
-      const int value = *std::get_if<int>(&cell_value.value);
+    if (cell_value.value_int.has_value()) {
+      const int value = *cell_value.value_int;
       const std::string value_str = std::to_string(value);
       uiDefIconTextBut(params.block,
                        UI_BTYPE_LABEL,
@@ -137,8 +137,8 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
                        0,
                        nullptr);
     }
-    else if (std::holds_alternative<float>(cell_value.value)) {
-      const float value = *std::get_if<float>(&cell_value.value);
+    else if (cell_value.value_float.has_value()) {
+      const float value = *cell_value.value_float;
       std::stringstream ss;
       ss << std::fixed << std::setprecision(3) << value;
       const std::string value_str = ss.str();
@@ -158,8 +158,8 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
                        0,
                        nullptr);
     }
-    else if (std::holds_alternative<bool>(cell_value.value)) {
-      const bool value = *std::get_if<bool>(&cell_value.value);
+    else if (cell_value.value_bool.has_value()) {
+      const bool value = *cell_value.value_bool;
       const int icon = value ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT;
       uiDefIconTextBut(params.block,
                        UI_BTYPE_LABEL,
@@ -177,8 +177,8 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
                        0,
                        nullptr);
     }
-    else if (std::holds_alternative<ObjectCellValue>(cell_value.value)) {
-      const ObjectCellValue value = *std::get_if<ObjectCellValue>(&cell_value.value);
+    else if (cell_value.value_object.has_value()) {
+      const ObjectCellValue value = *cell_value.value_object;
       uiDefIconTextBut(params.block,
                        UI_BTYPE_LABEL,
                        0,
@@ -195,8 +195,8 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
                        0,
                        nullptr);
     }
-    else if (std::holds_alternative<CollectionCellValue>(cell_value.value)) {
-      const CollectionCellValue value = *std::get_if<CollectionCellValue>(&cell_value.value);
+    else if (cell_value.value_collection.has_value()) {
+      const CollectionCellValue value = *cell_value.value_collection;
       uiDefIconTextBut(params.block,
                        UI_BTYPE_LABEL,
                        0,
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.hh b/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.hh
index cfbf6963a9d..611337df007 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column_layout.hh
@@ -16,7 +16,7 @@
 
 #pragma once
 
-#include <variant>
+#include <optional>
 
 #include "spreadsheet_draw.hh"
 
@@ -39,12 +39,15 @@ struct CollectionCellValue {
  */
 class CellValue {
  public:
-  /* The implementation just uses a `std::variant` for simplicity. It can be encapsulated better,
-   * but it's not really worth the complexity for now. */
-  using VariantType =
-      std::variant<std::monostate, int, float, bool, ObjectCellValue, CollectionCellValue>;
-
-  VariantType value;
+  /* The implementation just uses a bunch of `std::option` for now. Unfortunately, we cannot use
+   * `std::variant` yet, due to missing compiler support. This type can really be optimized more,
+   * but it does not really matter too much currently. */
+
+  std::optional<int> value_int;
+  std::optional<float> value_float;
+  std::optional<bool> value_bool;
+  std::optional<ObjectCellValue> value_object;
+  std::optional<CollectionCellValue> value_collection;
 };
 
 /**
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
index f5a4f09a5a2..590fbfb5024 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
@@ -54,12 +54,12 @@ static void add_columns_for_instances(const InstancesComponent &instances_compon
         const InstancedData &data = instance_data[index];
         if (data.type == INSTANCE_DATA_TYPE_OBJECT) {
           if (data.data.object != nullptr) {
-            r_cell_value.value = ObjectCellValue{data.data.object};
+            r_cell_value.value_object = ObjectCellValue{data.data.object};
           }
         }
         else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) {
           if (data.data.collection != nullptr) {
-            r_cell_value.value = CollectionCellValue{data.data.collection};
+            r_cell_value.value_collection = CollectionCellValue{data.data.collection};
           }
         }
       }));
@@ -71,7 +71,7 @@ static void add_columns_for_instances(const InstancesComponent &instances_compon
     std::string name = std::string("Position ") + axis_char[i];
     columns.append(spreadsheet_column_from_function(
         name, [transforms, i](int index, CellValue &r_cell_value) {
-          r_cell_value.value = transforms[index].translation()[i];
+          r_cell_value.value_float = transforms[index].translation()[i];
         }));
   }
 
@@ -79,7 +79,7 @@ static void add_columns_for_instances(const InstancesComponent &instances_compon
     std::string name = std::string("Rotation ") + axis_char[i];
     columns.append(spreadsheet_column_from_function(
         name, [transforms, i](int index, CellValue &r_cell_value) {
-          r_cell_value.value = transforms[index].to_euler()[i];
+          r_cell_value.value_float = transforms[index].to_euler()[i];
         }));
   }
 
@@ -87,7 +87,7 @@ static void add_columns_for_instances(const InstancesComponent &instances_compon
     std::string name = std::string("Scale ") + axis_char[i];
     columns.append(spreadsheet_column_from_function(
         name, [transforms, i](int index, CellValue &r_cell_value) {
-          r_cell_value.value = transforms[index].scale()[i];
+          r_cell_value.value_float = transforms[index].scale()[i];
         }));
   }
 
@@ -129,7 +129,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
           attribute_name, [attribute](int index, CellValue &r_cell_value) {
             float value;
             attribute->get(index, &value);
-            r_cell_value.value = value;
+            r_cell_value.value_float = value;
           }));
       break;
     }
@@ -141,7 +141,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
             name, [attribute, i](int index, CellValue &r_cell_value) {
               float2 value;
               attribute->get(index, &value);
-              r_cell_value.value = value[i];
+              r_cell_value.value_float = value[i];
             }));
       }
       break;
@@ -154,7 +154,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
             name, [attribute, i](int index, CellValue &r_cell_value) {
               float3 value;
               attribute->get(index, &value);
-              r_cell_value.value = value[i];
+              r_cell_value.value_float = value[i];
             }));
       }
       break;
@@ -167,7 +167,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
             name, [attribute, i](int index, CellValue &r_cell_value) {
               Color4f value;
               attribute->get(index, &value);
-              r_cell_value.value = value[i];
+              r_cell_value.value_float = value[i];
             }));
       }
       break;
@@ -177,7 +177,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
           attribute_name, [attribute](int index, CellValue &r_cell_value) {
             int value;
             attribute->get(index, &value);
-            r_cell_value.value = value;
+            r_cell_value.value_int = value;
           }));
       break;
     }
@@ -186,7 +186,7 @@ static void add_columns_for_attribute(const ReadAttribute *attribute,
           attribute_name, [attribute](int index, CellValue &r_cell_value) {
             bool value;
             attribute->get(index, &value);
-            r_cell_value.value = value;
+            r_cell_value.value_bool = value;
           }));
       break;
     }



More information about the Bf-blender-cvs mailing list