diff --git a/sjplayer/src/sjplayer/ElementProgramSet.d b/sjplayer/src/sjplayer/ElementProgramSet.d new file mode 100644 index 0000000..fd18719 --- /dev/null +++ b/sjplayer/src/sjplayer/ElementProgramSet.d @@ -0,0 +1,36 @@ +/// License: MIT +module sjplayer.ElementProgramSet; + +import std.meta, + std.typecons; + +import sjplayer.CircleElement; + +/// +class ElementProgramSet { + public: + /// + alias ElementPrograms = Tuple!(CircleElementProgram); + + /// + this() { + foreach (ref program; programs_) { + program = new typeof(program); + } + } + ~this() { + foreach (program; programs_) { + program.destroy(); + } + } + + /// + T Get(T)() out (r; r) { + enum index = staticIndexOf!(T, ElementPrograms.Types); + static assert(index >= 0); + return programs_[index]; + } + + private: + ElementPrograms programs_; +} diff --git a/sjplayer/standalone/main.d b/sjplayer/standalone/main.d index 4abc669..293e496 100644 --- a/sjplayer/standalone/main.d +++ b/sjplayer/standalone/main.d @@ -20,12 +20,14 @@ int main(string[] args) { scope(exit) sfMusic_destroy(music); sfMusic_play(music); + import sjplayer.ElementProgramSet; + auto programs = new ElementProgramSet; + scope(exit) programs.destroy(); + import sjplayer.CircleElement; - auto program = new CircleElementProgram; - scope(exit) program.destroy(); auto element = new CircleElement; scope(exit) element.destroy(); - auto drawer = new CircleElementDrawer(program, [element]); + auto drawer = new CircleElementDrawer(programs.Get!CircleElementProgram, [element]); scope(exit) drawer.destroy(); with (element) {