Overte C++ Documentation
ScriptInitializerMixin.h
1 //
2 // ScriptInitializerMixin.h
3 // libraries/shared/src/shared
4 //
5 // Copyright 2018 High Fidelity, Inc.
6 // Copyright 2023 Overte e.V.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // SPDX-License-Identifier: Apache-2.0
10 //
11 
12 #pragma once
13 
14 #include <functional>
15 #include <mutex>
16 #include "../DependencyManager.h"
17 
18 class ScriptEngine;
19 
20 template <typename T> class ScriptInitializerMixin {
21 public:
22  using ScriptInitializer = std::function<void(T)>;
23  virtual void registerScriptInitializer(ScriptInitializer initializer) {
24  InitializerLock lock(_scriptInitializerMutex);
25  _scriptInitializers.push_back(initializer);
26  }
27  virtual int runScriptInitializers(T engine) {
28  InitializerLock lock(_scriptInitializerMutex);
29  return std::count_if(_scriptInitializers.begin(), _scriptInitializers.end(),
30  [engine](auto initializer){ initializer(engine); return true; }
31  );
32  }
33  virtual ~ScriptInitializerMixin() {}
34 protected:
35  std::mutex _scriptInitializerMutex;
36  using InitializerLock = std::lock_guard<std::mutex>;
37  std::list<ScriptInitializer> _scriptInitializers;
38 };
39 
40 class ScriptInitializers : public ScriptInitializerMixin<ScriptEngine*>, public Dependency {
41 public:
42  // Lightweight `ScriptEngine*` initializer (only depends on built-in Qt components)
43  // example registration:
44  // eg: [&](ScriptEngine* engine) {
45  // engine->globalObject().setProperties("API", engine->newQObject(...instance...))
46  // };
47 };
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93