aboutsummaryrefslogtreecommitdiff
path: root/core/src/Model/Workflow
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-05-31 12:27:58 -0700
committerrtk0c <[email protected]>2021-05-31 12:27:58 -0700
commit8157678eba97d7de5c53b424a9866d327392bbd9 (patch)
tree26348a926040ccfc91f74cdfe49f7153db271f87 /core/src/Model/Workflow
parenteef2514908cdec3ec02888b7467cc877d33c1ceb (diff)
Fix standard incompetence found by MSVC
- requires-expression still not working, because they aren't supported yet outside of a concept
Diffstat (limited to 'core/src/Model/Workflow')
-rw-r--r--core/src/Model/Workflow/Values/BasicValues.cpp16
-rw-r--r--core/src/Model/Workflow/Workflow.hpp44
-rw-r--r--core/src/Model/Workflow/Workflow_Main.cpp16
3 files changed, 39 insertions, 37 deletions
diff --git a/core/src/Model/Workflow/Values/BasicValues.cpp b/core/src/Model/Workflow/Values/BasicValues.cpp
index a7cf635..748c652 100644
--- a/core/src/Model/Workflow/Values/BasicValues.cpp
+++ b/core/src/Model/Workflow/Values/BasicValues.cpp
@@ -14,14 +14,13 @@ NumericValue::NumericValue()
{
}
-template <class T>
+template <class T, int kMaxSize>
static std::string NumberToString(T value)
{
- constexpr auto kSize = std::numeric_limits<T>::max_digits10;
- char buf[kSize];
+ char buf[kMaxSize];
#if PLATFORM_WIN32
- auto res = std::to_chars(buf, buf + kSize, value);
+ auto res = std::to_chars(buf, buf + kMaxSize, value);
if (res.ec == std::errc()) {
return std::string(buf, res.ptr);
} else {
@@ -35,17 +34,20 @@ static std::string NumberToString(T value)
std::string NumericValue::GetTruncatedString() const
{
- return ::NumberToString((int64_t)mValue);
+ constexpr auto kMaxSize = std::numeric_limits<int64_t>::digits10;
+ return ::NumberToString<int64_t, kMaxSize>((int64_t)mValue);
}
std::string NumericValue::GetRoundedString() const
{
- return ::NumberToString((int64_t)std::round(mValue));
+ constexpr auto kMaxSize = std::numeric_limits<int64_t>::digits10;
+ return ::NumberToString<int64_t, kMaxSize>((int64_t)std::round(mValue));
}
std::string NumericValue::GetString() const
{
- return ::NumberToString(mValue);
+ constexpr auto kMaxSize = std::numeric_limits<double>::max_digits10;
+ return ::NumberToString<double, kMaxSize>(mValue);
}
int64_t NumericValue::GetInt() const
diff --git a/core/src/Model/Workflow/Workflow.hpp b/core/src/Model/Workflow/Workflow.hpp
index ded9bfb..161400e 100644
--- a/core/src/Model/Workflow/Workflow.hpp
+++ b/core/src/Model/Workflow/Workflow.hpp
@@ -5,6 +5,7 @@
#include "cplt_fwd.hpp"
#include <imgui_node_editor.h>
+#include <any>
#include <cstddef>
#include <cstdint>
#include <filesystem>
@@ -240,34 +241,27 @@ public:
/* Graph rebuild */
- struct GraphUpdateResult
+ enum GraphUpdateResult
{
- struct Success
- {
- };
-
- struct NoWorkToDo
- {
- };
-
- struct UnsatisfiedDependencies
- {
- std::vector<uint32_t> UnsatisfiedNodes;
- };
-
- struct UnreachableNodes
- {
- std::vector<uint32_t> UnreachableNodes;
- };
-
- using T = std::variant<
- Success,
- NoWorkToDo,
- UnsatisfiedDependencies,
- UnreachableNodes>;
+ /// Successfully rebuilt graph dependent data.
+ /// Details: nothing is written.
+ GUR_Success,
+ /// Nothing has changed since last time UpdateGraph() was called.
+ /// Details: nothing is written.
+ GUR_NoWorkToDo,
+ /// Details: list of nodes is written.
+ GUR_UnsatisfiedDependencies,
+ /// Details: list of nodes is written.
+ GUR_UnreachableNodes,
};
- GraphUpdateResult::T UpdateGraph();
+ using GraphUpdateDetails = std::variant<
+ // Case: nothing
+ std::monostate,
+ // Case: list of nodes (ids)
+ std::vector<uint32_t>>;
+
+ GraphUpdateResult UpdateGraph(GraphUpdateDetails* details = nullptr);
/* Serialization */
diff --git a/core/src/Model/Workflow/Workflow_Main.cpp b/core/src/Model/Workflow/Workflow_Main.cpp
index bfe007c..61cd510 100644
--- a/core/src/Model/Workflow/Workflow_Main.cpp
+++ b/core/src/Model/Workflow/Workflow_Main.cpp
@@ -524,10 +524,10 @@ bool Workflow::DisconnectByDestination(WorkflowNode& destinationNode, uint32_t d
return true;
}
-Workflow::GraphUpdateResult::T Workflow::UpdateGraph()
+Workflow::GraphUpdateResult Workflow::UpdateGraph(GraphUpdateDetails* details)
{
if (!mDepthsDirty) {
- return GraphUpdateResult::NoWorkToDo{};
+ return GUR_NoWorkToDo;
}
// Terminology:
@@ -577,7 +577,10 @@ Workflow::GraphUpdateResult::T Workflow::UpdateGraph()
}
if (!unsatisfiedNodes.empty()) {
- return GraphUpdateResult::UnsatisfiedDependencies{ std::move(unsatisfiedNodes) };
+ if (details) {
+ details->emplace<decltype(unsatisfiedNodes)>(std::move(unsatisfiedNodes));
+ }
+ return GUR_UnsatisfiedDependencies;
}
}
@@ -624,10 +627,13 @@ Workflow::GraphUpdateResult::T Workflow::UpdateGraph()
unreachableNodes.push_back(i);
}
- return GraphUpdateResult::UnreachableNodes{ std::move(unreachableNodes) };
+ if (details) {
+ details->emplace<decltype(unreachableNodes)>(std::move(unreachableNodes));
+ }
+ return GUR_UnreachableNodes;
}
- return GraphUpdateResult::Success{};
+ return GUR_Success;
}
Workflow::ReadResult Workflow::ReadFrom(std::istream& stream)