JitModel.hpp
1 #pragma once
2 #include <Process/Execution/ProcessComponent.hpp>
3 #include <Process/GenericProcessFactory.hpp>
4 #include <Process/Process.hpp>
5 #include <Process/ProcessMetadata.hpp>
6 #include <Process/Script/ScriptEditor.hpp>
7 
8 #include <Scenario/Commands/ScriptEditCommand.hpp>
9 
10 #include <Control/DefaultEffectItem.hpp>
11 #include <Effect/EffectFactory.hpp>
12 #include <JitCpp/EditScript.hpp>
13 
14 #include <ossia/dataflow/execution_state.hpp>
15 #include <ossia/dataflow/graph_node.hpp>
16 #include <ossia/dataflow/node_process.hpp>
17 namespace Jit
18 {
19 class JitEffectModel;
20 }
21 
22 PROCESS_METADATA(
23  , Jit::JitEffectModel, "0a3b49d6-4ce7-4668-aec3-9505b6ee1a60", "Jit", "JIT",
24  Process::ProcessCategory::Script, "Script", "JIT compilation process", "ossia score",
25  QStringList{}, {}, {}, Process::ProcessFlags::SupportsAll)
26 namespace Jit
27 {
28 struct Driver;
29 
30 using NodeCompiler = Driver;
31 using NodeFactory = std::function<ossia::graph_node*()>;
32 
33 class JitEffectModel : public Process::ProcessModel
34 {
35  friend class JitUI;
36  friend class JitUpdateUI;
37  SCORE_SERIALIZE_FRIENDS
38  PROCESS_METADATA_IMPL(JitEffectModel)
39 
40  W_OBJECT(JitEffectModel)
41 public:
42  JitEffectModel(
43  TimeVal t, const QString& jitProgram, const Id<Process::ProcessModel>&,
44  QObject* parent);
45  ~JitEffectModel() override;
46 
47  JitEffectModel(DataStream::Deserializer& vis, QObject* parent);
48  JitEffectModel(JSONObject::Deserializer& vis, QObject* parent);
49  JitEffectModel(DataStream::Deserializer&& vis, QObject* parent);
50  JitEffectModel(JSONObject::Deserializer&& vis, QObject* parent);
51 
52  bool validate(const QString& txt) const noexcept;
53 
54  const QString& script() const { return m_text; }
55  [[nodiscard]] Process::ScriptChangeResult setScript(const QString& txt);
56  void scriptChanged(const QString& txt) W_SIGNAL(scriptChanged, txt);
57  void programChanged() W_SIGNAL(programChanged);
58 
59  static constexpr bool hasExternalUI() noexcept { return true; }
60 
61  QString prettyName() const noexcept override;
62 
63  std::shared_ptr<NodeFactory> factory;
64 
65  void errorMessage(int line, const QString& e) W_SIGNAL(errorMessage, line, e);
66  PROPERTY(QString, script READ script WRITE setScript NOTIFY scriptChanged)
67 private:
68  std::shared_ptr<NodeFactory> getJitFactory();
69 
70  QString effect() const noexcept override;
71  void loadPreset(const Process::Preset& preset) override;
72  Process::Preset savePreset() const noexcept override;
73 
74  void init();
75  [[nodiscard]] Process::ScriptChangeResult reload();
76  QString m_text;
77  std::unique_ptr<NodeCompiler> m_compiler;
78 };
79 
80 struct LanguageSpec
81 {
82  static constexpr const char* language = "C++";
83 };
84 
86 using LayerFactory = Process::EffectLayerFactory_T<
87  JitEffectModel, Process::DefaultEffectItem,
89  JitEffectModel, JitEffectModel::p_script, LanguageSpec>>;
90 }
91 
92 namespace Process
93 {
94 template <>
95 QString
96 EffectProcessFactory_T<Jit::JitEffectModel>::customConstructionData() const noexcept;
97 
98 template <>
99 Process::Descriptor
100 EffectProcessFactory_T<Jit::JitEffectModel>::descriptor(QString d) const noexcept;
101 }
102 
103 namespace Execution
104 {
106  : public Execution::ProcessComponent_T<Jit::JitEffectModel, ossia::node_process>
107 {
108  COMPONENT_METADATA("122ceaeb-cbcc-4808-91f2-1929e3ca8292")
109 
110 public:
111  static constexpr bool is_unique = true;
112 
114  Jit::JitEffectModel& proc, const Execution::Context& ctx, QObject* parent);
115  ~JitEffectComponent() override;
116 };
119 }
120 
121 namespace Jit
122 {
123 class EditScript : public Scenario::EditScript<JitEffectModel, JitEffectModel::p_script>
124 {
125  SCORE_COMMAND_DECL(CommandFactoryName(), EditScript, "Edit a C++ program")
126 public:
128 };
129 
130 }
131 
132 namespace score
133 {
134 template <>
135 struct StaticPropertyCommand<Jit::JitEffectModel::p_script> : Jit::EditScript
136 {
137  using Jit::EditScript::EditScript;
138 };
139 }
Definition: DataStreamVisitor.hpp:202
Definition: JitModel.hpp:107
Definition: Process/Execution/ProcessComponent.hpp:119
Definition: JSONVisitor.hpp:423
Definition: JitModel.hpp:124
Definition: DefaultEffectItem.hpp:26
Definition: EffectFactory.hpp:66
Definition: EffectFactory.hpp:14
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: ScriptEditor.hpp:42
Definition: ScriptEditCommand.hpp:23
The id_base_t class.
Definition: Identifier.hpp:57
Components used for the execution of a score.
Definition: ProcessComponent.cpp:12
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Definition: ExecutionContext.hpp:75
Definition: Process/Execution/ProcessComponent.hpp:89
Definition: ScriptProcess.hpp:14
Definition: TimeValue.hpp:21
Definition: PropertyCommand.hpp:112