Преглед изворни кода

new examples from the MW Laptop

sfxsfl пре 8 месеци
родитељ
комит
61c69ec446
100 измењених фајлова са 4049 додато и 0 уклоњено
  1. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/c7e0473a-c3da-4659-9d2a-def3aa0d8bd1.vsidx
  2. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/c9b88735-7e49-4762-8d0c-620311cca80f.vsidx
  3. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/edbaba08-cb9d-4978-92f6-71e9134bb372.vsidx
  4. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/fae28d0f-60a2-43bc-952d-ca6ba1575d7e.vsidx
  5. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/.suo
  6. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/Browse.VC.db
  7. 173 0
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/DocumentLayout.backup.json
  8. 173 0
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/DocumentLayout.json
  9. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/ipch/AutoPCH/3cfdd7f574f50aea/MYHELPER.ipch
  10. BIN
      CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/ipch/AutoPCH/886d547eae9944c3/CPP-SIGNAL-BUS.ipch
  11. 31 0
      CPP-Signal-Bus/CPP-Signal-Bus.sln
  12. 229 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager.cpp
  13. 86 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager.h
  14. 229 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionManager.cpp
  15. 86 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionManager.h
  16. 189 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionRequest.cpp
  17. 130 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionRequest.h
  18. 76 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionResult.cpp
  19. 67 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionResult.h
  20. 189 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionRequest.cpp
  21. 130 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionRequest.h
  22. 76 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionResult.cpp
  23. 67 0
      CPP-Signal-Bus/CPP-Signal-Bus/ActionResult.h
  24. 154 0
      CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj
  25. 75 0
      CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj.filters
  26. 4 0
      CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj.user
  27. 41 0
      CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalBus.cpp
  28. 40 0
      CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalBus.h
  29. 31 0
      CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalEvent.cpp
  30. 38 0
      CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalEvent.h
  31. 62 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalBus.cpp
  32. 45 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalBus.h
  33. 39 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalEvent.cpp
  34. 52 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalEvent.h
  35. 41 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler.cpp
  36. 54 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler.h
  37. 41 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalBus.cpp
  38. 40 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalBus.h
  39. 31 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalEvent.cpp
  40. 38 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalEvent.h
  41. 62 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalBus.cpp
  42. 45 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalBus.h
  43. 39 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalEvent.cpp
  44. 52 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalEvent.h
  45. 41 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalHandler.cpp
  46. 54 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalHandler.h
  47. 128 0
      CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/main.cpp
  48. 416 0
      CPP-Signal-Bus/CPP-Signal-Bus/main.cpp
  49. 99 0
      CPP-Signal-Bus/CPP-Signal-Bus/myHelper.cpp
  50. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionManager.obj
  51. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionRequest.obj
  52. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionResult.obj
  53. 11 0
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.exe.recipe
  54. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.ilk
  55. 3 0
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.log
  56. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.obj
  57. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.command.1.tlog
  58. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.read.1.tlog
  59. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.write.1.tlog
  60. 2 0
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CPP-Signal-Bus.lastbuildstate
  61. 10 0
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/Cl.items.tlog
  62. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.command.1.tlog
  63. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.read.1.tlog
  64. 2 0
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.secondary.1.tlog
  65. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.write.1.tlog
  66. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ObjectSignalBus.obj
  67. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ObjectSignalEvent.obj
  68. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalBus.obj
  69. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalEvent.obj
  70. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalHandler.obj
  71. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/main.obj
  72. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/myHelper.obj
  73. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/vc143.idb
  74. BIN
      CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/vc143.pdb
  75. BIN
      CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.exe
  76. BIN
      CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.pdb
  77. BIN
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/FileContentIndex/29632633-baf1-49e3-b9d9-eafae14c3aa9.vsidx
  78. BIN
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/.suo
  79. BIN
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/Browse.VC.db
  80. 37 0
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/DocumentLayout.backup.json
  81. 37 0
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/DocumentLayout.json
  82. BIN
      CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/ipch/AutoPCH/3df2f9daddc278e3/CRTP RUNTIME COMPILE.ipch
  83. 31 0
      CRTP RunTime Compile/CRTP RunTime Compile.sln
  84. 44 0
      CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.cpp
  85. 135 0
      CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj
  86. 22 0
      CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj.filters
  87. 4 0
      CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj.user
  88. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.command.1.tlog
  89. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.read.1.tlog
  90. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.write.1.tlog
  91. 2 0
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CRTP RunTime Compile.lastbuildstate
  92. 1 0
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/Cl.items.tlog
  93. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.command.1.tlog
  94. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.read.1.tlog
  95. 2 0
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.secondary.1.tlog
  96. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.write.1.tlog
  97. 11 0
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.exe.recipe
  98. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.ilk
  99. 2 0
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.log
  100. BIN
      CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.obj

BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/c7e0473a-c3da-4659-9d2a-def3aa0d8bd1.vsidx


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/c9b88735-7e49-4762-8d0c-620311cca80f.vsidx


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/edbaba08-cb9d-4978-92f6-71e9134bb372.vsidx


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/FileContentIndex/fae28d0f-60a2-43bc-952d-ca6ba1575d7e.vsidx


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/.suo


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/Browse.VC.db


+ 173 - 0
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/DocumentLayout.backup.json

@@ -0,0 +1,173 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionRequest.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalHandler.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalEvent.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalBus.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionResult.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionRequest.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionManager.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\USERS\\SFREUNDE\\SOURCE\\REPOS\\CPP-SIGNAL-BUS\\CPP-SIGNAL-BUS\\MYHELPER.CPP||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-SIGNAL-BUS\\MYHELPER.CPP||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 8,
+          "Children": [
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "ActionRequest.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionRequest.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionRequest.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:33:00.519Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 2,
+              "Title": "SignalHandler.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalHandler.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalHandler.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:44.148Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 3,
+              "Title": "SignalEvent.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalEvent.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalEvent.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:36.118Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 4,
+              "Title": "SignalBus.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalBus.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalBus.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:09.341Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 5,
+              "Title": "ActionResult.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionResult.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionResult.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:52.594Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "ActionRequest.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionRequest.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionRequest.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:42.553Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 7,
+              "Title": "ActionManager.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionManager.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionManager.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:18.491Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 8,
+              "Title": "myHelper.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\myHelper.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\myHelper.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\myHelper.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\myHelper.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:24:26.555Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "main.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\main.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp*",
+              "RelativeToolTip": "CPP-Signal-Bus\\main.cpp*",
+              "ViewState": "AgIAACcAAAAAAAAAAAAAADEAAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:14:45.387Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 173 - 0
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/DocumentLayout.json

@@ -0,0 +1,173 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionRequest.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalHandler.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalEvent.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\SignalBus.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionResult.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionRequest.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-Signal-Bus\\ActionManager.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|C:\\USERS\\SFREUNDE\\SOURCE\\REPOS\\CPP-SIGNAL-BUS\\CPP-SIGNAL-BUS\\MYHELPER.CPP||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{2397DB77-CCB5-42EC-A094-802CCC42A37B}|CPP-Signal-Bus\\CPP-Signal-Bus.vcxproj|solutionrelative:CPP-SIGNAL-BUS\\MYHELPER.CPP||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 8,
+          "Children": [
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "ActionRequest.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionRequest.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionRequest.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:33:00.519Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 2,
+              "Title": "SignalHandler.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalHandler.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalHandler.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalHandler.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:44.148Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 3,
+              "Title": "SignalEvent.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalEvent.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalEvent.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalEvent.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:36.118Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 4,
+              "Title": "SignalBus.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\SignalBus.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\SignalBus.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\SignalBus.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:32:09.341Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 5,
+              "Title": "ActionResult.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionResult.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionResult.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionResult.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:52.594Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 6,
+              "Title": "ActionRequest.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionRequest.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionRequest.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionRequest.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:42.553Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 7,
+              "Title": "ActionManager.h",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\ActionManager.h",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\ActionManager.h",
+              "RelativeToolTip": "CPP-Signal-Bus\\ActionManager.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-29T15:31:18.491Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 8,
+              "Title": "myHelper.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\myHelper.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\myHelper.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\myHelper.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\myHelper.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:24:26.555Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "main.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp",
+              "RelativeDocumentMoniker": "CPP-Signal-Bus\\main.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CPP-Signal-Bus\\CPP-Signal-Bus\\main.cpp",
+              "RelativeToolTip": "CPP-Signal-Bus\\main.cpp",
+              "ViewState": "AgIAACcAAAAAAAAAAAAAAEgAAAAbAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T15:14:45.387Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/ipch/AutoPCH/3cfdd7f574f50aea/MYHELPER.ipch


BIN
CPP-Signal-Bus/.vs/CPP-Signal-Bus/v17/ipch/AutoPCH/886d547eae9944c3/CPP-SIGNAL-BUS.ipch


+ 31 - 0
CPP-Signal-Bus/CPP-Signal-Bus.sln

@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.13.35931.197 d17.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CPP-Signal-Bus", "CPP-Signal-Bus\CPP-Signal-Bus.vcxproj", "{2397DB77-CCB5-42EC-A094-802CCC42A37B}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Debug|x64.ActiveCfg = Debug|x64
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Debug|x64.Build.0 = Debug|x64
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Debug|x86.ActiveCfg = Debug|Win32
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Debug|x86.Build.0 = Debug|Win32
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Release|x64.ActiveCfg = Release|x64
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Release|x64.Build.0 = Release|x64
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Release|x86.ActiveCfg = Release|Win32
+		{2397DB77-CCB5-42EC-A094-802CCC42A37B}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {A7D882E9-23E7-495F-A7CD-10C42894837E}
+	EndGlobalSection
+EndGlobal

+ 229 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager.cpp

@@ -0,0 +1,229 @@
+#ifndef ACTIONMANAGER_CPP
+#define ACTIONMANAGER_CPP
+
+#include <random>
+
+#include "ActionManager.h"
+
+// #include "ActionRequest.h"
+// #include "ActionResult.h"
+
+using namespace std;
+
+static int getRandomInt(int a, int b){
+    int max, min;
+    if(a>b){
+        max = a; min = b;
+    }else{
+        max = b; min = a;
+    }
+    random_device rd;
+    mt19937 gen(rd());
+    uniform_real_distribution<double> distr(min, max);
+
+    return (int) distr(gen);
+}
+static string randomString(int len = 9) {
+    const char alphanum[] =
+        "0123456789"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz";
+    int stringLen = sizeof(alphanum) - 1;
+
+    string str;
+    for (int i = 0; i < len; i++) {
+        int rnd = getRandomInt(0, stringLen);
+        str += alphanum[rnd % stringLen];
+    }
+    return str;
+}
+
+
+///ActionResult
+
+
+///ActionRequest
+
+
+
+///ActionManager
+ActionManager::ActionManager(){
+
+}
+ActionManager::~ActionManager(){
+	if(hasAnyRequests()){
+		while(hasAnyRequests()){
+			ActionRequest* req  = popFromQueue();
+			ActionResult* res = getResultByID(req->getID());
+
+			if(req){
+				emit(req->getID());
+				if(res){
+					req->handle(res);
+				}
+				removeRequest(req->getID());
+				removeResult(req->getID());
+			}
+		}
+	}
+}
+
+bool ActionManager::hasAnyRequests(){
+	return (!requests.empty());
+}
+
+bool ActionManager::isEmptyQueue(){
+	return actionQueue.empty();
+}
+
+
+bool ActionManager::handleCurrRequest(){
+	ActionRequest* req  = popFromQueue();
+	if(req){
+
+		ActionResult* newRes = processRequest(req);
+		ActionResult* oldRes = getResultByID(req->getID());
+
+		ARS status = req->getStatus();
+
+		if(status == ARS::FULFILLED){
+			sendEvent(req->getID(), newRes);
+			req->handle(newRes);
+		}
+		if(req->isWaiting()){
+			pushToNext(req);
+			results[req->getID()] = newRes;
+		}else{
+			removeRequest(req->getID());
+			removeResult(req->getID());
+		}
+		
+		return true;
+	}
+	return false;
+}
+
+ActionResult* ActionManager::processRequest(ActionRequest* req){
+
+	ActionResult* oldRes = getResultByID(req->getID());
+
+	ActionResult* newRes = NULL;
+	
+	if(req->isWaiting()){
+		ARS oldState = req->getStatus();
+
+		if(oldState == ARS::PROCESSING){
+			req->waitOnce();
+		}
+		ActionResult* newRes = req->process(oldRes);
+
+		ARS newState = req->getStatus();
+
+		if(newState != oldState){
+			req->onStateChange(newRes);
+		}
+
+		return newRes;
+	}else{
+		newRes = new ActionResult(*oldRes);
+	}
+
+	return newRes;
+}
+
+ActionRequest* ActionManager::getCurrentRequest(){
+	ActionRequest* req = NULL;
+	if(!actionQueue.empty()){
+		req = actionQueue.front();
+	}
+	return req;
+}
+
+void ActionManager::pushRequest(ActionRequest* req){
+	if(req==NULL) return;
+	if(results.count(req->getID())<=0){
+
+		requests[req->getID()] = req;
+		results[req->getID()] = new ActionResult(req->getID());
+
+		// req->changeStatus(ARS::PENDING);
+
+		subscribe(req->getID(), req->getActionHandler());
+
+		pushToQueue(req);
+	}
+}
+ActionRequest* ActionManager::removeRequest(string id){
+	ActionRequest* req = NULL;
+	if(requests.count(id)>0){
+		req = requests[id];
+		if(req){
+			requests.erase(id);
+		}
+	}
+	return req;
+}
+ActionResult* ActionManager::removeResult(string id){
+	ActionResult* res = NULL;
+	if(results.count(id)>0){
+		res = results[id];
+		if(res){
+			results.erase(id);
+		}
+	}
+	return res;
+}
+
+void ActionManager::pushToQueue(ActionRequest* req){
+	actionQueue.push(req);
+}
+
+void ActionManager::pushToNext(ActionRequest* req){
+	nextQueue.push(req);
+}
+
+ActionRequest* ActionManager::popFromQueue(){
+	ActionRequest* req = NULL;
+	if(!actionQueue.empty()){
+		req = actionQueue.front();
+		actionQueue.pop();
+	}
+	return req;
+}
+
+ActionRequest* ActionManager::getRequestByID(string id){
+	if(requests.count(id)>0){
+		return requests[id];
+	}
+	return NULL;
+}
+ActionResult* ActionManager::getResultByID(string id){
+	if(results.count(id)>0){
+		return results[id];
+	}
+	return NULL;
+}
+
+void ActionManager::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n);
+		sendEvent(n, event);
+	}
+}
+
+SignalEvent* ActionManager::createSignalEvent(string n){
+	ActionResult* event = NULL;
+	if(results.count(n)>0){
+		event = results[n];
+	}
+
+	return event;
+}
+
+void ActionManager::placeNextQueue(){
+	actionQueue = nextQueue;
+	queue<ActionRequest*> newQueue;
+	nextQueue = newQueue;
+}
+
+#endif

+ 86 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager.h

@@ -0,0 +1,86 @@
+#ifndef ACTIONMANAGER_H
+#define ACTIONMANAGER_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+#include <initializer_list>
+
+#include <functional>
+
+#include "SignalBus.h"
+
+#include "ActionRequest.h"
+#include "ActionResult.h"
+
+using namespace std;
+
+/*	
+	ActionManager is a Command bus that makes use of ActionRequests as the commands and invokes them after a certain period of time
+	and returns a Result to the Signalhandlers it stores based on the id of that request, along with the result data
+*/
+
+class ActionManager:public SignalBus{
+public:
+	//creates the action manager object
+	ActionManager();
+	~ActionManager();
+	//emits a signal based on the id of the request, which will send the current result to the completion handler for the request object
+	virtual void emit(string n);
+	//processes a request and returns a result object which may be temporary for further processing or the final result for completion
+	
+	ActionResult* processRequest(ActionRequest* req);
+	//handles the current request on the top of the queue as it pops and returns it back in the queue for next step
+	bool handleCurrRequest();
+	//push request to the bottom of the queue of other requests and the request lists based on id
+	//also creates a pending result fro the request to process it
+	void pushRequest(ActionRequest* req);
+	//removes a request from the queue and the list based on the id
+	ActionRequest* removeRequest(string id);
+	//removes a result from the result list by request id
+	ActionResult* removeResult(string id);
+	//gets a request in the list by id
+	ActionRequest* getRequestByID(string id);
+	//gets a result object in the list by id
+	ActionResult* getResultByID(string id);
+	//get current request at the top of the queue
+	ActionRequest* getCurrentRequest();
+	//replaces the current queue with the queue of next requests
+	void placeNextQueue();
+	//checks if there are any requests in the queue or the next queue
+	bool hasAnyRequests();
+	//checks if the current queue is empty
+	bool isEmptyQueue();
+	//gets the number of requests in the current queue
+	int getQueueSize(){
+		return (int) actionQueue.size();
+	}
+	//gets number of requests in the next queue
+	int getNextQueueSize(){
+		return (int) nextQueue.size();
+	}
+protected:
+	// virtual void sendEvent(string n, SignalEvent* event);
+	//creates a Actionresult based on an id and returns it as an Actionresult
+	virtual SignalEvent* createSignalEvent(string n);
+	//pushes a request to the current queue
+	void pushToQueue(ActionRequest* req);
+	//pushes a request to the next queue
+	void pushToNext(ActionRequest* req);
+	//pops a request from the current queue
+	ActionRequest* popFromQueue();
+
+	map<string, ActionRequest*> requests;	//list of all requests sorted by id
+	map<string, ActionResult*> results;	//list of all results sorted by request id
+	// queue<ActionRequest*> actionQueue;
+	queue<ActionRequest*> actionQueue;	//queue for actionRequests
+	queue<ActionRequest*> nextQueue;	//next queue for actionRequests
+};
+
+
+#endif

+ 229 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionManager.cpp

@@ -0,0 +1,229 @@
+#ifndef ACTIONMANAGER_CPP
+#define ACTIONMANAGER_CPP
+
+#include <random>
+
+#include "ActionManager.h"
+
+// #include "ActionRequest.h"
+// #include "ActionResult.h"
+
+using namespace std;
+
+static int getRandomInt(int a, int b){
+    int max, min;
+    if(a>b){
+        max = a; min = b;
+    }else{
+        max = b; min = a;
+    }
+    random_device rd;
+    mt19937 gen(rd());
+    uniform_real_distribution<double> distr(min, max);
+
+    return (int) distr(gen);
+}
+static string randomString(int len = 9) {
+    const char alphanum[] =
+        "0123456789"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz";
+    int stringLen = sizeof(alphanum) - 1;
+
+    string str;
+    for (int i = 0; i < len; i++) {
+        int rnd = getRandomInt(0, stringLen);
+        str += alphanum[rnd % stringLen];
+    }
+    return str;
+}
+
+
+///ActionResult
+
+
+///ActionRequest
+
+
+
+///ActionManager
+ActionManager::ActionManager(){
+
+}
+ActionManager::~ActionManager(){
+	if(hasAnyRequests()){
+		while(hasAnyRequests()){
+			ActionRequest* req  = popFromQueue();
+			ActionResult* res = getResultByID(req->getID());
+
+			if(req){
+				emit(req->getID());
+				if(res){
+					req->handle(res);
+				}
+				removeRequest(req->getID());
+				removeResult(req->getID());
+			}
+		}
+	}
+}
+
+bool ActionManager::hasAnyRequests(){
+	return (!requests.empty());
+}
+
+bool ActionManager::isEmptyQueue(){
+	return actionQueue.empty();
+}
+
+
+bool ActionManager::handleCurrRequest(){
+	ActionRequest* req  = popFromQueue();
+	if(req){
+
+		ActionResult* newRes = processRequest(req);
+		ActionResult* oldRes = getResultByID(req->getID());
+
+		ARS status = req->getStatus();
+
+		if(status == ARS::FULFILLED){
+			sendEvent(req->getID(), newRes);
+			req->handle(newRes);
+		}
+		if(req->isWaiting()){
+			pushToNext(req);
+			results[req->getID()] = newRes;
+		}else{
+			removeRequest(req->getID());
+			removeResult(req->getID());
+		}
+		
+		return true;
+	}
+	return false;
+}
+
+ActionResult* ActionManager::processRequest(ActionRequest* req){
+
+	ActionResult* oldRes = getResultByID(req->getID());
+
+	ActionResult* newRes = NULL;
+	
+	if(req->isWaiting()){
+		ARS oldState = req->getStatus();
+
+		if(oldState == ARS::PROCESSING){
+			req->waitOnce();
+		}
+		ActionResult* newRes = req->process(oldRes);
+
+		ARS newState = req->getStatus();
+
+		if(newState != oldState){
+			req->onStateChange(newRes);
+		}
+
+		return newRes;
+	}else{
+		newRes = new ActionResult(*oldRes);
+	}
+
+	return newRes;
+}
+
+ActionRequest* ActionManager::getCurrentRequest(){
+	ActionRequest* req = NULL;
+	if(!actionQueue.empty()){
+		req = actionQueue.front();
+	}
+	return req;
+}
+
+void ActionManager::pushRequest(ActionRequest* req){
+	if(req==NULL) return;
+	if(results.count(req->getID())<=0){
+
+		requests[req->getID()] = req;
+		results[req->getID()] = new ActionResult(req->getID());
+
+		// req->changeStatus(ARS::PENDING);
+
+		subscribe(req->getID(), req->getActionHandler());
+
+		pushToQueue(req);
+	}
+}
+ActionRequest* ActionManager::removeRequest(string id){
+	ActionRequest* req = NULL;
+	if(requests.count(id)>0){
+		req = requests[id];
+		if(req){
+			requests.erase(id);
+		}
+	}
+	return req;
+}
+ActionResult* ActionManager::removeResult(string id){
+	ActionResult* res = NULL;
+	if(results.count(id)>0){
+		res = results[id];
+		if(res){
+			results.erase(id);
+		}
+	}
+	return res;
+}
+
+void ActionManager::pushToQueue(ActionRequest* req){
+	actionQueue.push(req);
+}
+
+void ActionManager::pushToNext(ActionRequest* req){
+	nextQueue.push(req);
+}
+
+ActionRequest* ActionManager::popFromQueue(){
+	ActionRequest* req = NULL;
+	if(!actionQueue.empty()){
+		req = actionQueue.front();
+		actionQueue.pop();
+	}
+	return req;
+}
+
+ActionRequest* ActionManager::getRequestByID(string id){
+	if(requests.count(id)>0){
+		return requests[id];
+	}
+	return NULL;
+}
+ActionResult* ActionManager::getResultByID(string id){
+	if(results.count(id)>0){
+		return results[id];
+	}
+	return NULL;
+}
+
+void ActionManager::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n);
+		sendEvent(n, event);
+	}
+}
+
+SignalEvent* ActionManager::createSignalEvent(string n){
+	ActionResult* event = NULL;
+	if(results.count(n)>0){
+		event = results[n];
+	}
+
+	return event;
+}
+
+void ActionManager::placeNextQueue(){
+	actionQueue = nextQueue;
+	queue<ActionRequest*> newQueue;
+	nextQueue = newQueue;
+}
+
+#endif

+ 86 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionManager.h

@@ -0,0 +1,86 @@
+#ifndef ACTIONMANAGER_H
+#define ACTIONMANAGER_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+#include <initializer_list>
+
+#include <functional>
+
+#include "../SignalHandler/SignalBus.h"
+
+#include "ActionRequest.h"
+#include "ActionResult.h"
+
+using namespace std;
+
+/*	
+	ActionManager is a Command bus that makes use of ActionRequests as the commands and invokes them after a certain period of time
+	and returns a Result to the Signalhandlers it stores based on the id of that request, along with the result data
+*/
+
+class ActionManager:public SignalBus{
+public:
+	//creates the action manager object
+	ActionManager();
+	~ActionManager();
+	//emits a signal based on the id of the request, which will send the current result to the completion handler for the request object
+	virtual void emit(string n);
+	//processes a request and returns a result object which may be temporary for further processing or the final result for completion
+	
+	ActionResult* processRequest(ActionRequest* req);
+	//handles the current request on the top of the queue as it pops and returns it back in the queue for next step
+	bool handleCurrRequest();
+	//push request to the bottom of the queue of other requests and the request lists based on id
+	//also creates a pending result fro the request to process it
+	void pushRequest(ActionRequest* req);
+	//removes a request from the queue and the list based on the id
+	ActionRequest* removeRequest(string id);
+	//removes a result from the result list by request id
+	ActionResult* removeResult(string id);
+	//gets a request in the list by id
+	ActionRequest* getRequestByID(string id);
+	//gets a result object in the list by id
+	ActionResult* getResultByID(string id);
+	//get current request at the top of the queue
+	ActionRequest* getCurrentRequest();
+	//replaces the current queue with the queue of next requests
+	void placeNextQueue();
+	//checks if there are any requests in the queue or the next queue
+	bool hasAnyRequests();
+	//checks if the current queue is empty
+	bool isEmptyQueue();
+	//gets the number of requests in the current queue
+	int getQueueSize(){
+		return (int) actionQueue.size();
+	}
+	//gets number of requests in the next queue
+	int getNextQueueSize(){
+		return (int) nextQueue.size();
+	}
+protected:
+	// virtual void sendEvent(string n, SignalEvent* event);
+	//creates a Actionresult based on an id and returns it as an Actionresult
+	virtual SignalEvent* createSignalEvent(string n);
+	//pushes a request to the current queue
+	void pushToQueue(ActionRequest* req);
+	//pushes a request to the next queue
+	void pushToNext(ActionRequest* req);
+	//pops a request from the current queue
+	ActionRequest* popFromQueue();
+
+	map<string, ActionRequest*> requests;	//list of all requests sorted by id
+	map<string, ActionResult*> results;	//list of all results sorted by request id
+	// queue<ActionRequest*> actionQueue;
+	queue<ActionRequest*> actionQueue;	//queue for actionRequests
+	queue<ActionRequest*> nextQueue;	//next queue for actionRequests
+};
+
+
+#endif

+ 189 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionRequest.cpp

@@ -0,0 +1,189 @@
+#ifndef ACTIONREQUEST_CPP
+#define ACTIONREQUEST_CPP
+
+#include <random>
+
+#include "ActionRequest.h"
+#include "../myHelper.cpp"
+
+using namespace std;
+
+static int getRandomInt(int a, int b){
+    int max, min;
+    if(a>b){
+        max = a; min = b;
+    }else{
+        max = b; min = a;
+    }
+    random_device rd;
+    mt19937 gen(rd());
+    uniform_real_distribution<double> distr(min, max);
+
+    return (int) distr(gen);
+}
+static string randomString(int len = 9) {
+    const char alphanum[] =
+        "0123456789"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz";
+    int stringLen = sizeof(alphanum) - 1;
+
+    string str;
+    for (int i = 0; i < len; i++) {
+        int rnd = getRandomInt(0, stringLen);
+        str += alphanum[rnd % stringLen];
+    }
+    return str;
+}
+
+ActionRequest::ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	requestData = _data;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler([this](SignalEvent* e){
+		_process(e);
+	});
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func, function<void(SignalEvent*)> func2){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	requestData = _data;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler(func2);
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, function<void(SignalEvent*)> func){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler([this](SignalEvent* e){
+		_process(e);
+	});
+
+	status = ARS::PENDING;
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, function<void(SignalEvent*)> func, function<void(SignalEvent*)> func2){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler(func2);
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(ActionRequest& other){
+	id = randomString(8);
+
+	startCount = other.waitCount;
+	waitCount = other.waitCount;
+
+	requestData = other.requestData;
+	actionHandler = new FunctionHandler(*(other.actionHandler));
+	processHandler = new FunctionHandler(*(other.processHandler));
+	status = other.status;
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::~ActionRequest(){
+	actionHandler = NULL;
+	processHandler = NULL;
+	// result = NULL;
+}
+
+ActionRequest* ActionRequest::clone(){
+	return new ActionRequest(*this);
+}
+
+void ActionRequest::changeStatus(ARS newState){
+	ARS oldState = status;
+	status = newState;
+
+	//maybe emit signal or run onStateChange
+}
+
+string* ActionRequest::getData(string key){
+	if(requestData.count(key)>0){
+		return &(requestData[key]);
+	}
+	return NULL;
+}
+string* ActionRequest::setData(string key, string val){
+	string* _val = NULL;
+	if(requestData.count(key)>0){
+		_val = &(requestData[key]);
+	}
+	requestData[key] = val;
+	return _val;
+}
+void ActionRequest::setDataMap(map<string,string> newData){
+	requestData = newData;
+}
+map<string,string> ActionRequest::getDataMap(){
+	return requestData;
+}
+
+void ActionRequest::handle(ActionResult* res){
+	
+}
+
+void ActionRequest::onStateChange(SignalEvent* e){
+
+	ActionResult* newResult = static_cast<ActionResult*>(e);
+	
+	//do smt on state change
+}
+ActionResult* ActionRequest::process(ActionResult* oldRes){
+	ActionResult* newRes = new ActionResult(*oldRes);
+	
+	if(status == ARS::PENDING){
+		changeStatus(ARS::PROCESSING);
+	}
+	if(status == ARS::PROCESSING){
+		_process(newRes);
+		SignalHandler* _handler = getProcessHandler();
+		_handler->handle(newRes);
+
+		if(waitCount==0){
+			newRes->resolve(true);
+		}else if(waitCount<0){
+			newRes->resolve(false);
+		}
+	}
+
+	if(newRes->isFinished()){
+		changeStatus(ARS::FULFILLED);
+	}
+
+	return newRes;
+}
+void ActionRequest::_process(SignalEvent* e){
+	
+	ActionResult* res  = static_cast<ActionResult*>(e);
+
+	for(auto kv: requestData){
+		if(!res->getData(kv.first)){
+			res->setData(kv.first, kv.second);
+		}
+	}
+
+}
+
+
+#endif

+ 130 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionRequest.h

@@ -0,0 +1,130 @@
+#ifndef ACTIONREQUEST_H
+#define ACTIONREQUEST_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+
+#include <functional>
+
+#include "../SignalHandler/SignalHandler.h"
+
+#include "ActionResult.h"
+
+using namespace std;
+
+/*	
+	ACTION REQUEST STATE
+	Enum to show state of the Request, showing whether it is waiting to process, processing or finished processing
+*/
+
+enum ARS{
+	PENDING,
+	PROCESSING,
+	FULFILLED
+};
+
+/*	
+	Request for action that has handlers to process and invoke a request based on a certain function
+	Request will create a result as it processes and update the result data based on the process function
+	and the request data as an input
+*/
+
+class ActionRequest{
+	friend class ActionManager;
+public:
+	//create a request with a number of steps to wait, input data, processing function and function to handle when it finishes
+	ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func);
+	ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func, function<void(SignalEvent*)> proc);
+	ActionRequest(int _wait, function<void(SignalEvent*)> func);
+	ActionRequest(int _wait, function<void(SignalEvent*)> func, function<void(SignalEvent*)> proc);
+	//copy constructor for action request to clone request
+	ActionRequest(ActionRequest& other);
+	~ActionRequest();
+
+	//clones request
+	ActionRequest* clone();
+	//processes a result to create a new result
+	ActionResult* process(ActionResult* oldRes);
+	//handles result when state changes
+	virtual void onStateChange(SignalEvent* res);
+	//handles result when it completes
+	virtual void handle(ActionResult* res);
+
+	//sets data for request input based on a key
+	string* setData(string key, string val);
+	//sets all data for request as a map
+	void setDataMap(map<string,string> newData);
+	//gets all data for request as a map
+	map<string,string> getDataMap();
+	//gets data for request based on a key
+	string* getData(string key);
+
+	//changes status of request
+	void changeStatus(ARS newState);
+	//get number of steps to wait for request	
+	int getWaitCount(){
+		return waitCount;
+	}
+	//get number of steps request was meant to wait entirely
+	int getStartCount(){
+		return startCount;
+	}
+	//get the handler for action on completion
+	SignalHandler* getActionHandler(){
+		return actionHandler;
+	}
+	//get the handler for processing result
+	SignalHandler* getProcessHandler(){
+		return processHandler;
+	}
+	//get id of request
+	string getID(){
+		return id;
+	}
+	//get status of request as a string
+	string getStatusAsString(){
+		return ActionRequest::statusToString(getStatus());
+	}
+	//get status of request as an ARS
+	ARS getStatus(){
+		return status;
+	}
+	//gets a string version of an ARS
+	static string statusToString(ARS status){
+		switch(status){
+			case (ARS::PENDING): return "PENDING";
+			case (ARS::PROCESSING): return "PROCESSING";
+			case (ARS::FULFILLED): return "FULFILLED";
+			default: return "UNKNOWN";
+		}
+	}
+	//checks if the request has not been fulfilled
+	bool isWaiting(){
+		return (status != ARS::FULFILLED);
+	}
+	//virtual function for a request to wait once as it processes
+	virtual void waitOnce(){
+		waitCount--;
+	}
+protected:
+	//internal processor for request for a specific result
+	virtual void _process(SignalEvent* res);
+	int waitCount;	//number of steps to wait until exeecution
+	int startCount;	//number of steps to wait from the beginning
+
+	ARS status;	//status of request
+	
+	map<string,string> requestData;	//data of request
+	FunctionHandler* actionHandler;	//signalhandler for handling completion
+	FunctionHandler* processHandler;	//signalhandler for handling processing
+private:
+	string id;	//id of request that is auto generated
+};
+
+#endif

+ 76 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionResult.cpp

@@ -0,0 +1,76 @@
+#ifndef ACTIONRESULT_CPP
+#define ACTIONRESULT_CPP
+
+#include <random>
+
+#include "ActionResult.h"
+
+using namespace std;
+
+ActionResult::ActionResult(string _id){
+	id = _id;
+	success = false;
+
+}
+ActionResult::ActionResult(string _id, bool s){
+	id = _id;
+	success = s;
+}
+ActionResult::ActionResult(string _id, bool s, std::map<string, string> _data){
+	id = _id;
+	success = s;
+	resultData = _data;
+}
+ActionResult::ActionResult(ActionResult& other){
+	id = other.id;
+	success = other.success;
+	finished = other.finished;
+	resultData = other.resultData;
+}
+ActionResult::~ActionResult(){
+	
+}
+
+void ActionResult::resolve(bool s){
+	if(!finished){
+		finished = true;
+		success = s;
+	}
+}
+
+SignalEvent* ActionResult::clone(){
+	return new ActionResult(*this);
+}
+
+bool ActionResult::isFinished(){
+	return finished;
+}
+bool ActionResult::isSuccess(){
+	return success;
+}
+
+string* ActionResult::getData(string key){
+	if(resultData.count(key)>0){
+		return &(resultData[key]);
+	}
+	return NULL;
+}
+string* ActionResult::setData(string key, string val){
+	string* _val = NULL;
+	if(resultData.count(key)>0){
+		_val = &(resultData[key]);
+	}
+	resultData[key] = val;
+	return _val;
+}
+
+map<string,string> ActionResult::setDataMap(map<string,string> newData){
+	map<string,string> temp = resultData;
+	resultData = newData;
+	return temp;
+}
+map<string,string> ActionResult::getDataMap(){
+	return resultData;
+}
+
+#endif

+ 67 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionManager/ActionResult.h

@@ -0,0 +1,67 @@
+#ifndef ACTIONRESULT_H
+#define ACTIONRESULT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+
+#include <functional>
+
+#include "../SignalHandler/SignalEvent.h"
+// #include "ActionRequest.h"
+
+using namespace std;
+
+/*	
+	Result of Request while or after it has been processed with all the data meant to be returned after a certain time
+*/
+
+class ActionResult: public SignalEvent{
+friend class ActionRequest;
+friend class ActionManager;
+public:
+	//creates the result based on the request id, success and result data
+	ActionResult(string id);
+	ActionResult(string id, bool success);
+	ActionResult(string id, bool success, map<string,string> _data);
+	ActionResult(ActionResult& other);
+	~ActionResult();
+
+	//creates a clone of the result since it is a signal event
+	SignalEvent* clone();
+	
+	//get data based on a key or returns null if nonexistent
+	string* getData(string key);
+	//set data based on a key and value
+	string* setData(string key, string val);
+	//set data using a hashmap of strings
+	map<string,string> setDataMap(map<string,string> newData);
+	//get all data as a hashmap
+	map<string,string> getDataMap();
+	//returns the id of the result, which is the id of the original request
+	string getRequestID(){
+		return id;
+	}
+	
+	//check if request was finished
+	bool isFinished();
+	//check if request was a success
+	bool isSuccess();
+
+	//resolves the result by finishing the request and setting its succession
+	void resolve(bool s);
+protected:
+
+	bool success;	//request succession
+	bool finished;	//request completion
+	map<string,string> resultData; //data of the result
+	string id;	//id of the original request
+
+};
+
+#endif

+ 189 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionRequest.cpp

@@ -0,0 +1,189 @@
+#ifndef ACTIONREQUEST_CPP
+#define ACTIONREQUEST_CPP
+
+#include <random>
+
+#include "ActionRequest.h"
+#include "myHelper.cpp"
+
+using namespace std;
+
+static int getRandomInt(int a, int b){
+    int max, min;
+    if(a>b){
+        max = a; min = b;
+    }else{
+        max = b; min = a;
+    }
+    random_device rd;
+    mt19937 gen(rd());
+    uniform_real_distribution<double> distr(min, max);
+
+    return (int) distr(gen);
+}
+static string randomString(int len = 9) {
+    const char alphanum[] =
+        "0123456789"
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz";
+    int stringLen = sizeof(alphanum) - 1;
+
+    string str;
+    for (int i = 0; i < len; i++) {
+        int rnd = getRandomInt(0, stringLen);
+        str += alphanum[rnd % stringLen];
+    }
+    return str;
+}
+
+ActionRequest::ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	requestData = _data;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler([this](SignalEvent* e){
+		_process(e);
+	});
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func, function<void(SignalEvent*)> func2){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	requestData = _data;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler(func2);
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, function<void(SignalEvent*)> func){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler([this](SignalEvent* e){
+		_process(e);
+	});
+
+	status = ARS::PENDING;
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(int _wait, function<void(SignalEvent*)> func, function<void(SignalEvent*)> func2){
+	id = randomString(8);
+
+	waitCount = _wait;
+	startCount = _wait;
+	actionHandler = new FunctionHandler(func);
+	processHandler = new FunctionHandler(func2);
+
+	status = ARS::PENDING;
+
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::ActionRequest(ActionRequest& other){
+	id = randomString(8);
+
+	startCount = other.waitCount;
+	waitCount = other.waitCount;
+
+	requestData = other.requestData;
+	actionHandler = new FunctionHandler(*(other.actionHandler));
+	processHandler = new FunctionHandler(*(other.processHandler));
+	status = other.status;
+	// result = new ActionResult(getID(), this);
+}
+ActionRequest::~ActionRequest(){
+	actionHandler = NULL;
+	processHandler = NULL;
+	// result = NULL;
+}
+
+ActionRequest* ActionRequest::clone(){
+	return new ActionRequest(*this);
+}
+
+void ActionRequest::changeStatus(ARS newState){
+	ARS oldState = status;
+	status = newState;
+
+	//maybe emit signal or run onStateChange
+}
+
+string* ActionRequest::getData(string key){
+	if(requestData.count(key)>0){
+		return &(requestData[key]);
+	}
+	return NULL;
+}
+string* ActionRequest::setData(string key, string val){
+	string* _val = NULL;
+	if(requestData.count(key)>0){
+		_val = &(requestData[key]);
+	}
+	requestData[key] = val;
+	return _val;
+}
+void ActionRequest::setDataMap(map<string,string> newData){
+	requestData = newData;
+}
+map<string,string> ActionRequest::getDataMap(){
+	return requestData;
+}
+
+void ActionRequest::handle(ActionResult* res){
+	
+}
+
+void ActionRequest::onStateChange(SignalEvent* e){
+
+	ActionResult* newResult = static_cast<ActionResult*>(e);
+	
+	//do smt on state change
+}
+ActionResult* ActionRequest::process(ActionResult* oldRes){
+	ActionResult* newRes = new ActionResult(*oldRes);
+	
+	if(status == ARS::PENDING){
+		changeStatus(ARS::PROCESSING);
+	}
+	if(status == ARS::PROCESSING){
+		_process(newRes);
+		SignalHandler* _handler = getProcessHandler();
+		_handler->handle(newRes);
+
+		if(waitCount==0){
+			newRes->resolve(true);
+		}else if(waitCount<0){
+			newRes->resolve(false);
+		}
+	}
+
+	if(newRes->isFinished()){
+		changeStatus(ARS::FULFILLED);
+	}
+
+	return newRes;
+}
+void ActionRequest::_process(SignalEvent* e){
+	
+	ActionResult* res  = static_cast<ActionResult*>(e);
+
+	for(auto kv: requestData){
+		if(!res->getData(kv.first)){
+			res->setData(kv.first, kv.second);
+		}
+	}
+
+}
+
+
+#endif

+ 130 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionRequest.h

@@ -0,0 +1,130 @@
+#ifndef ACTIONREQUEST_H
+#define ACTIONREQUEST_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+
+#include <functional>
+
+#include "SignalHandler.h"
+
+#include "ActionResult.h"
+
+using namespace std;
+
+/*	
+	ACTION REQUEST STATE
+	Enum to show state of the Request, showing whether it is waiting to process, processing or finished processing
+*/
+
+enum ARS{
+	PENDING,
+	PROCESSING,
+	FULFILLED
+};
+
+/*	
+	Request for action that has handlers to process and invoke a request based on a certain function
+	Request will create a result as it processes and update the result data based on the process function
+	and the request data as an input
+*/
+
+class ActionRequest{
+	friend class ActionManager;
+public:
+	//create a request with a number of steps to wait, input data, processing function and function to handle when it finishes
+	ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func);
+	ActionRequest(int _wait, map<string,string> _data, function<void(SignalEvent*)> func, function<void(SignalEvent*)> proc);
+	ActionRequest(int _wait, function<void(SignalEvent*)> func);
+	ActionRequest(int _wait, function<void(SignalEvent*)> func, function<void(SignalEvent*)> proc);
+	//copy constructor for action request to clone request
+	ActionRequest(ActionRequest& other);
+	~ActionRequest();
+
+	//clones request
+	ActionRequest* clone();
+	//processes a result to create a new result
+	ActionResult* process(ActionResult* oldRes);
+	//handles result when state changes
+	virtual void onStateChange(SignalEvent* res);
+	//handles result when it completes
+	virtual void handle(ActionResult* res);
+
+	//sets data for request input based on a key
+	string* setData(string key, string val);
+	//sets all data for request as a map
+	void setDataMap(map<string,string> newData);
+	//gets all data for request as a map
+	map<string,string> getDataMap();
+	//gets data for request based on a key
+	string* getData(string key);
+
+	//changes status of request
+	void changeStatus(ARS newState);
+	//get number of steps to wait for request	
+	int getWaitCount(){
+		return waitCount;
+	}
+	//get number of steps request was meant to wait entirely
+	int getStartCount(){
+		return startCount;
+	}
+	//get the handler for action on completion
+	SignalHandler* getActionHandler(){
+		return actionHandler;
+	}
+	//get the handler for processing result
+	SignalHandler* getProcessHandler(){
+		return processHandler;
+	}
+	//get id of request
+	string getID(){
+		return id;
+	}
+	//get status of request as a string
+	string getStatusAsString(){
+		return ActionRequest::statusToString(getStatus());
+	}
+	//get status of request as an ARS
+	ARS getStatus(){
+		return status;
+	}
+	//gets a string version of an ARS
+	static string statusToString(ARS status){
+		switch(status){
+			case (ARS::PENDING): return "PENDING";
+			case (ARS::PROCESSING): return "PROCESSING";
+			case (ARS::FULFILLED): return "FULFILLED";
+			default: return "UNKNOWN";
+		}
+	}
+	//checks if the request has not been fulfilled
+	bool isWaiting(){
+		return (status != ARS::FULFILLED);
+	}
+	//virtual function for a request to wait once as it processes
+	virtual void waitOnce(){
+		waitCount--;
+	}
+protected:
+	//internal processor for request for a specific result
+	virtual void _process(SignalEvent* res);
+	int waitCount;	//number of steps to wait until exeecution
+	int startCount;	//number of steps to wait from the beginning
+
+	ARS status;	//status of request
+	
+	map<string,string> requestData;	//data of request
+	FunctionHandler* actionHandler;	//signalhandler for handling completion
+	FunctionHandler* processHandler;	//signalhandler for handling processing
+private:
+	string id;	//id of request that is auto generated
+};
+
+#endif

+ 76 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionResult.cpp

@@ -0,0 +1,76 @@
+#ifndef ACTIONRESULT_CPP
+#define ACTIONRESULT_CPP
+
+#include <random>
+
+#include "ActionResult.h"
+
+using namespace std;
+
+ActionResult::ActionResult(string _id){
+	id = _id;
+	success = false;
+
+}
+ActionResult::ActionResult(string _id, bool s){
+	id = _id;
+	success = s;
+}
+ActionResult::ActionResult(string _id, bool s, std::map<string, string> _data){
+	id = _id;
+	success = s;
+	resultData = _data;
+}
+ActionResult::ActionResult(ActionResult& other){
+	id = other.id;
+	success = other.success;
+	finished = other.finished;
+	resultData = other.resultData;
+}
+ActionResult::~ActionResult(){
+	
+}
+
+void ActionResult::resolve(bool s){
+	if(!finished){
+		finished = true;
+		success = s;
+	}
+}
+
+SignalEvent* ActionResult::clone(){
+	return new ActionResult(*this);
+}
+
+bool ActionResult::isFinished(){
+	return finished;
+}
+bool ActionResult::isSuccess(){
+	return success;
+}
+
+string* ActionResult::getData(string key){
+	if(resultData.count(key)>0){
+		return &(resultData[key]);
+	}
+	return NULL;
+}
+string* ActionResult::setData(string key, string val){
+	string* _val = NULL;
+	if(resultData.count(key)>0){
+		_val = &(resultData[key]);
+	}
+	resultData[key] = val;
+	return _val;
+}
+
+map<string,string> ActionResult::setDataMap(map<string,string> newData){
+	map<string,string> temp = resultData;
+	resultData = newData;
+	return temp;
+}
+map<string,string> ActionResult::getDataMap(){
+	return resultData;
+}
+
+#endif

+ 67 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ActionResult.h

@@ -0,0 +1,67 @@
+#ifndef ACTIONRESULT_H
+#define ACTIONRESULT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <queue>
+#include <ctime>
+#include <utility>
+
+#include <functional>
+
+#include "SignalEvent.h"
+// #include "ActionRequest.h"
+
+using namespace std;
+
+/*	
+	Result of Request while or after it has been processed with all the data meant to be returned after a certain time
+*/
+
+class ActionResult: public SignalEvent{
+friend class ActionRequest;
+friend class ActionManager;
+public:
+	//creates the result based on the request id, success and result data
+	ActionResult(string id);
+	ActionResult(string id, bool success);
+	ActionResult(string id, bool success, map<string,string> _data);
+	ActionResult(ActionResult& other);
+	~ActionResult();
+
+	//creates a clone of the result since it is a signal event
+	SignalEvent* clone();
+	
+	//get data based on a key or returns null if nonexistent
+	string* getData(string key);
+	//set data based on a key and value
+	string* setData(string key, string val);
+	//set data using a hashmap of strings
+	map<string,string> setDataMap(map<string,string> newData);
+	//get all data as a hashmap
+	map<string,string> getDataMap();
+	//returns the id of the result, which is the id of the original request
+	string getRequestID(){
+		return id;
+	}
+	
+	//check if request was finished
+	bool isFinished();
+	//check if request was a success
+	bool isSuccess();
+
+	//resolves the result by finishing the request and setting its succession
+	void resolve(bool s);
+protected:
+
+	bool success;	//request succession
+	bool finished;	//request completion
+	map<string,string> resultData; //data of the result
+	string id;	//id of the original request
+
+};
+
+#endif

+ 154 - 0
CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>17.0</VCProjectVersion>
+    <Keyword>Win32Proj</Keyword>
+    <ProjectGuid>{2397db77-ccb5-42ec-a094-802ccc42a37b}</ProjectGuid>
+    <RootNamespace>CPPSignalBus</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="ActionManager.cpp" />
+    <ClCompile Include="ActionRequest.cpp" />
+    <ClCompile Include="ActionResult.cpp" />
+    <ClCompile Include="main.cpp" />
+    <ClCompile Include="myHelper.cpp" />
+    <ClCompile Include="ObjectSignalBus.cpp" />
+    <ClCompile Include="ObjectSignalEvent.cpp" />
+    <ClCompile Include="SignalBus.cpp" />
+    <ClCompile Include="SignalEvent.cpp" />
+    <ClCompile Include="SignalHandler.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="ActionManager.h" />
+    <ClInclude Include="ActionRequest.h" />
+    <ClInclude Include="ActionResult.h" />
+    <ClInclude Include="ObjectSignalBus.h" />
+    <ClInclude Include="ObjectSignalEvent.h" />
+    <ClInclude Include="SignalBus.h" />
+    <ClInclude Include="SignalEvent.h" />
+    <ClInclude Include="SignalHandler.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 75 - 0
CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj.filters

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="main.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ActionManager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ActionRequest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ActionResult.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="myHelper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ObjectSignalBus.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ObjectSignalEvent.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SignalBus.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SignalEvent.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SignalHandler.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="ActionManager.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ActionRequest.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ActionResult.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ObjectSignalBus.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ObjectSignalEvent.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="SignalBus.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="SignalEvent.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="SignalHandler.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 4 - 0
CPP-Signal-Bus/CPP-Signal-Bus/CPP-Signal-Bus.vcxproj.user

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>

+ 41 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalBus.cpp

@@ -0,0 +1,41 @@
+#ifndef OBJECTSIGNALBUS_CPP
+#define OBJECTSIGNALBUS_CPP
+
+#include "ObjectSignalBus.h"
+
+using namespace std;
+
+template<class T>
+ObjectSignalBus<T>::ObjectSignalBus(){
+	
+}
+template<class T>
+ObjectSignalBus<T>::~ObjectSignalBus(){
+	
+}
+template<class T>
+void ObjectSignalBus<T>::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n,NULL);
+
+		sendEvent(n, event);
+	}
+}
+template<class T>
+void ObjectSignalBus<T>::emit(string n, T* _data){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n, _data);
+
+		sendEvent(n, event);
+	}
+}
+template<class T>
+SignalEvent* ObjectSignalBus<T>::createSignalEvent(string n){
+	return new ObjectSignalEvent<T>(n,NULL);
+}
+template<class T>
+SignalEvent* ObjectSignalBus<T>::createSignalEvent(string n, T* _data){
+	return new ObjectSignalEvent<T>(n,_data);
+}
+
+#endif

+ 40 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalBus.h

@@ -0,0 +1,40 @@
+#ifndef OBJECTSIGNALBUS_H
+#define OBJECTSIGNALBUS_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalBus.h"
+#include "ObjectSignalEvent.h"
+
+using namespace std;
+
+/*	
+	SignalBus that handles all its events using ObjectSignalEvents, therefore can emit data in the event as well
+*/
+
+template<class T>
+class ObjectSignalBus: public SignalBus{
+public:
+	//creates a signal bus
+	ObjectSignalBus();
+	~ObjectSignalBus();
+	//emit the signal with NULL data
+	virtual void emit(string n);
+	//emits the signal with data passed into it
+	virtual void emit(string n, T* _data);
+
+protected:
+	//creates a signalevent of type ObjectSignalEvent but has NULL data
+	virtual SignalEvent* createSignalEvent(string n);
+	//creates a signalevent of type ObjectSignalEvent with specific data
+	virtual SignalEvent* createSignalEvent(string n, T* _data);
+};
+
+#endif

+ 31 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalEvent.cpp

@@ -0,0 +1,31 @@
+#ifndef OBJECTSIGNALEVENT_CPP
+#define OBJECTSIGNALEVENT_CPP
+
+#include "ObjectSignalEvent.h"
+
+using namespace std;
+
+template<class T>
+ObjectSignalEvent<T>::ObjectSignalEvent(string n, T* _data):SignalEvent(n){
+	data = _data;
+}
+template<class T>
+ObjectSignalEvent<T>::ObjectSignalEvent(ObjectSignalEvent& other){
+	this->data = other.data;
+	this->name = other.name;
+}
+template<class T>
+ObjectSignalEvent<T>::~ObjectSignalEvent(){
+	data = NULL;
+}
+template<class T>
+SignalEvent* ObjectSignalEvent<T>::clone(){
+	return new ObjectSignalEvent(*this);
+}
+template<class T>
+T* ObjectSignalEvent<T>::getData() const{
+	return data;
+}
+
+
+#endif

+ 38 - 0
CPP-Signal-Bus/CPP-Signal-Bus/ObjectSignalEvent.h

@@ -0,0 +1,38 @@
+#ifndef OBJECTSIGNALEVENT_H
+#define OBJECTSIGNALEVENT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalEvent.h"
+
+using namespace std;
+
+/*	
+	ObjectSignalEvent is an event that contains data of a specific type which can be passed on in a handler
+*/
+
+template<class T>
+class ObjectSignalEvent: public SignalEvent{
+public:
+	//create signalevent with the corresponding data
+	ObjectSignalEvent(string n, T* data);
+	ObjectSignalEvent(ObjectSignalEvent& other);
+	~ObjectSignalEvent();
+	//create clone of signal event
+	SignalEvent* clone();
+	//get the data passed on in the event
+	T* getData() const;
+public:
+	//data of the event as a pointer
+	T* data;
+};
+
+
+#endif

+ 62 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalBus.cpp

@@ -0,0 +1,62 @@
+#ifndef SIGNALBUS_CPP
+#define SIGNALBUS_CPP
+
+#include "SignalBus.h"
+#include "myHelper.cpp"
+
+SignalBus::SignalBus(){
+
+}
+SignalBus::~SignalBus(){
+	
+}
+bool SignalBus::hasSignal(string n){
+	return (signals.count(n)>0);
+}
+void SignalBus::subscribe(string n, SignalHandler* listener){
+	if(!hasSignal(n)){
+		signals[n] = new vector<SignalHandler*>();
+	}
+	vector<SignalHandler*>* listeners = signals[n];
+
+	listeners->push_back(listener);
+}
+void SignalBus::unsubscribe(string n, SignalHandler* listener){
+	if(hasSignal(n)){
+		vector<SignalHandler*>* listeners = signals[n];
+
+		for(int i=0; i<listeners->size(); i++){
+			SignalHandler* handler = (*listeners)[i];
+			if(listener == handler || listener->getID() == handler->getID()){
+				listeners->erase(listeners->begin()+i);
+				i--; //just to retain index
+			}
+		}
+	}
+}
+void SignalBus::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n);
+
+		sendEvent(n, event);
+	}
+}
+void SignalBus::sendEvent(string n, SignalEvent* event){
+	if(hasSignal(n)){
+		// cout<<"- sending event..."<<endl;
+		vector<SignalHandler*>* listeners = signals[n];
+		// cout<<"- NumOfListeners..."<<listeners->size()<<endl;
+		for(int i=0; i<listeners->size(); i++){
+			SignalHandler* handler = (*listeners)[i];
+			handler->handle(event);
+		}
+	}
+}
+
+SignalEvent* SignalBus::createSignalEvent(string n){
+	SignalEvent* event = new SignalDefaultEvent(n);
+
+	return event;
+}
+
+#endif

+ 45 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalBus.h

@@ -0,0 +1,45 @@
+#ifndef SIGNALBUS_H
+#define SIGNALBUS_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalHandler.h"
+
+using namespace std;
+
+/*	
+	SignalBus is a container that allows signalhandlers to be subscribed to it and handle them when the corresponding signal name is emitted
+	The signalhandlers in any object act as Observers to another object that holds the bus as a context, as to treat it dynamically and to not
+	explicitly observe the object state, but rather emit the signal based on a certain condition
+*/
+
+class SignalBus{
+public:
+	//creates the signal bus
+	SignalBus();
+	~SignalBus();
+	//emits the signal based on the name. Will create a signalevent and emit it to the corresponding listeners to that event name
+	virtual void emit(string n);
+	//subscribes a listener/handler to a signal name
+	void subscribe(string n, SignalHandler* listener);
+	//unsubscribes a listener/handler from a signal name
+	void unsubscribe(string n, SignalHandler* listener);
+	//check if the signal was created in the bus or if the signal has any listeners
+	bool hasSignal(string n);
+protected:
+	//a list of signals which listed as a signal name corresponding to a list of listeners
+	map<string, vector<SignalHandler*>*> signals;
+	//sends a specific signalevent to every listener to that event name
+	virtual void sendEvent(string n, SignalEvent* event);
+	//creates a signalevent based on the signal name, which by default is the SignalDefaultEvent, but this can be extended
+	virtual SignalEvent* createSignalEvent(string n);
+};
+
+#endif

+ 39 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalEvent.cpp

@@ -0,0 +1,39 @@
+#ifndef SIGNALEVENT_CPP
+#define SIGNALEVENT_CPP
+
+#include "SignalEvent.h"
+#include "myHelper.cpp"
+
+SignalEvent::SignalEvent(){
+	name = "";
+}
+SignalEvent::SignalEvent(string n){
+	name = n;
+}
+SignalEvent::~SignalEvent(){
+
+}
+string SignalEvent::getEventName() const{
+	return name;
+}
+
+static int CALLCOUNT = 0;
+
+SignalDefaultEvent::SignalDefaultEvent(string n):SignalEvent(n){
+	// name = n;
+	callTime = time(0);
+	callCount = CALLCOUNT++;
+}
+SignalDefaultEvent::SignalDefaultEvent(SignalDefaultEvent& other){
+	name = other.name;
+	callTime = other.callTime;
+	callCount = other.callCount;
+}
+SignalDefaultEvent::~SignalDefaultEvent(){
+
+}
+SignalEvent* SignalDefaultEvent::clone(){
+	return new SignalDefaultEvent(*this);
+}
+
+#endif

+ 52 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalEvent.h

@@ -0,0 +1,52 @@
+#ifndef SIGNALEVENT_H
+#define SIGNALEVENT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+using namespace std;
+
+/*	
+	SignalEvent carries data and the name of the emitted event from the SignalBus to be parsed and can be extended by any other class
+	This is used to share states dynamically in the observer pattern
+*/
+
+class SignalEvent{
+public:
+	//creates signal event with the event name
+	SignalEvent(string n);
+	~SignalEvent();
+	//get event name
+	string getEventName() const;
+	//creates a copy of the signal event
+	virtual SignalEvent* clone() = 0;
+protected:
+	SignalEvent();
+	string name;
+};
+
+/*	
+	Default Event that can be used to send signals that do not need to carry additional data
+*/
+
+class SignalDefaultEvent: public SignalEvent{
+public:
+	//creates the event object
+	SignalDefaultEvent(string n);
+	//copy constructor
+	SignalDefaultEvent(SignalDefaultEvent& other);
+	~SignalDefaultEvent();
+	//clone the signal event
+	SignalEvent* clone();
+
+	time_t callTime;	//records the step time it gets called
+	int callCount;		//records the amount of times the event was called
+};
+
+#endif

+ 41 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler.cpp

@@ -0,0 +1,41 @@
+#ifndef SIGNALHANDLER_CPP
+#define SIGNALHANDLER_CPP
+
+#include "SignalHandler.h"
+#include "myHelper.cpp"
+
+/////SignalEvent
+
+/////SignalHandler
+SignalHandler::SignalHandler(){
+	id = myHelper::randomString(8);
+}
+SignalHandler::~SignalHandler(){
+	
+}
+string SignalHandler::getID() const{
+	return id;
+}
+
+FunctionHandler::FunctionHandler(function<void(SignalEvent*)> newFunc){
+	func = newFunc;
+}
+FunctionHandler::FunctionHandler(FunctionHandler& other){
+	func = other.func;
+}
+FunctionHandler::~FunctionHandler(){
+	func = NULL;
+}
+void FunctionHandler::handle(SignalEvent* event){
+	//run function
+	func(event);
+}
+/////SignalBus
+
+///ObjectSignalEvent
+
+
+///ObjectSignalBus
+
+
+#endif

+ 54 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler.h

@@ -0,0 +1,54 @@
+#ifndef SIGNALHANDLER_H
+#define SIGNALHANDLER_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalEvent.h"
+
+using namespace std;
+
+/*	
+	SignalHandler will run a certain function whenever the signal is emitted and received, which "handles" the signal and data passed through
+	This runs or handles the state change in the observer
+*/
+
+class SignalHandler{
+public:
+	//creates the signal handler with a unique id
+	SignalHandler();
+	~SignalHandler();
+	//gets the id of handler
+	string getID() const;
+	//function used to handler the event and its data
+	virtual void handle(SignalEvent* event) = 0;
+
+private:
+	string id;
+};
+
+/*	
+	FunctionHandler is a signal handler will take a function as a paramter for contruction and use that to handle the signal instead
+*/
+
+class FunctionHandler: public SignalHandler{
+public:
+	//creates the signal handler with a function to store. Note that this is normally a function lambda
+	FunctionHandler(function<void(SignalEvent*)> newFunc);
+	//copy constructor for the handler
+	FunctionHandler(FunctionHandler& other);
+	~FunctionHandler();
+protected:
+	//function used to run the function contained to handle the event and its data
+	virtual void handle(SignalEvent* event);
+	//variable used to store the function. Function is a void type that takes a signalEvent ptr as a parameter
+	function<void(SignalEvent*)> func;
+};
+
+#endif

+ 41 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalBus.cpp

@@ -0,0 +1,41 @@
+#ifndef OBJECTSIGNALBUS_CPP
+#define OBJECTSIGNALBUS_CPP
+
+#include "ObjectSignalBus.h"
+
+using namespace std;
+
+template<class T>
+ObjectSignalBus<T>::ObjectSignalBus(){
+	
+}
+template<class T>
+ObjectSignalBus<T>::~ObjectSignalBus(){
+	
+}
+template<class T>
+void ObjectSignalBus<T>::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n,NULL);
+
+		sendEvent(n, event);
+	}
+}
+template<class T>
+void ObjectSignalBus<T>::emit(string n, T* _data){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n, _data);
+
+		sendEvent(n, event);
+	}
+}
+template<class T>
+SignalEvent* ObjectSignalBus<T>::createSignalEvent(string n){
+	return new ObjectSignalEvent<T>(n,NULL);
+}
+template<class T>
+SignalEvent* ObjectSignalBus<T>::createSignalEvent(string n, T* _data){
+	return new ObjectSignalEvent<T>(n,_data);
+}
+
+#endif

+ 40 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalBus.h

@@ -0,0 +1,40 @@
+#ifndef OBJECTSIGNALBUS_H
+#define OBJECTSIGNALBUS_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalBus.h"
+#include "ObjectSignalEvent.h"
+
+using namespace std;
+
+/*	
+	SignalBus that handles all its events using ObjectSignalEvents, therefore can emit data in the event as well
+*/
+
+template<class T>
+class ObjectSignalBus: public SignalBus{
+public:
+	//creates a signal bus
+	ObjectSignalBus();
+	~ObjectSignalBus();
+	//emit the signal with NULL data
+	virtual void emit(string n);
+	//emits the signal with data passed into it
+	virtual void emit(string n, T* _data);
+
+protected:
+	//creates a signalevent of type ObjectSignalEvent but has NULL data
+	virtual SignalEvent* createSignalEvent(string n);
+	//creates a signalevent of type ObjectSignalEvent with specific data
+	virtual SignalEvent* createSignalEvent(string n, T* _data);
+};
+
+#endif

+ 31 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalEvent.cpp

@@ -0,0 +1,31 @@
+#ifndef OBJECTSIGNALEVENT_CPP
+#define OBJECTSIGNALEVENT_CPP
+
+#include "ObjectSignalEvent.h"
+
+using namespace std;
+
+template<class T>
+ObjectSignalEvent<T>::ObjectSignalEvent(string n, T* _data):SignalEvent(n){
+	data = _data;
+}
+template<class T>
+ObjectSignalEvent<T>::ObjectSignalEvent(ObjectSignalEvent& other){
+	this->data = other.data;
+	this->name = other.name;
+}
+template<class T>
+ObjectSignalEvent<T>::~ObjectSignalEvent(){
+	data = NULL;
+}
+template<class T>
+SignalEvent* ObjectSignalEvent<T>::clone(){
+	return new ObjectSignalEvent(*this);
+}
+template<class T>
+T* ObjectSignalEvent<T>::getData() const{
+	return data;
+}
+
+
+#endif

+ 38 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/ObjectSignalEvent.h

@@ -0,0 +1,38 @@
+#ifndef OBJECTSIGNALEVENT_H
+#define OBJECTSIGNALEVENT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalEvent.h"
+
+using namespace std;
+
+/*	
+	ObjectSignalEvent is an event that contains data of a specific type which can be passed on in a handler
+*/
+
+template<class T>
+class ObjectSignalEvent: public SignalEvent{
+public:
+	//create signalevent with the corresponding data
+	ObjectSignalEvent(string n, T* data);
+	ObjectSignalEvent(ObjectSignalEvent& other);
+	~ObjectSignalEvent();
+	//create clone of signal event
+	SignalEvent* clone();
+	//get the data passed on in the event
+	T* getData() const;
+public:
+	//data of the event as a pointer
+	T* data;
+};
+
+
+#endif

+ 62 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalBus.cpp

@@ -0,0 +1,62 @@
+#ifndef SIGNALBUS_CPP
+#define SIGNALBUS_CPP
+
+#include "SignalBus.h"
+#include "../myHelper.cpp"
+
+SignalBus::SignalBus(){
+
+}
+SignalBus::~SignalBus(){
+	
+}
+bool SignalBus::hasSignal(string n){
+	return (signals.count(n)>0);
+}
+void SignalBus::subscribe(string n, SignalHandler* listener){
+	if(!hasSignal(n)){
+		signals[n] = new vector<SignalHandler*>();
+	}
+	vector<SignalHandler*>* listeners = signals[n];
+
+	listeners->push_back(listener);
+}
+void SignalBus::unsubscribe(string n, SignalHandler* listener){
+	if(hasSignal(n)){
+		vector<SignalHandler*>* listeners = signals[n];
+
+		for(int i=0; i<listeners->size(); i++){
+			SignalHandler* handler = (*listeners)[i];
+			if(listener == handler || listener->getID() == handler->getID()){
+				listeners->erase(listeners->begin()+i);
+				i--; //just to retain index
+			}
+		}
+	}
+}
+void SignalBus::emit(string n){
+	if(hasSignal(n)){
+		SignalEvent* event = createSignalEvent(n);
+
+		sendEvent(n, event);
+	}
+}
+void SignalBus::sendEvent(string n, SignalEvent* event){
+	if(hasSignal(n)){
+		// cout<<"- sending event..."<<endl;
+		vector<SignalHandler*>* listeners = signals[n];
+		// cout<<"- NumOfListeners..."<<listeners->size()<<endl;
+		for(int i=0; i<listeners->size(); i++){
+			SignalHandler* handler = (*listeners)[i];
+			handler->handle(event);
+		}
+	}
+}
+
+SignalEvent* SignalBus::createSignalEvent(string n){
+	SignalEvent* event = new SignalDefaultEvent(n);
+
+	return event;
+}
+
+#endif

+ 45 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalBus.h

@@ -0,0 +1,45 @@
+#ifndef SIGNALBUS_H
+#define SIGNALBUS_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalHandler.h"
+
+using namespace std;
+
+/*	
+	SignalBus is a container that allows signalhandlers to be subscribed to it and handle them when the corresponding signal name is emitted
+	The signalhandlers in any object act as Observers to another object that holds the bus as a context, as to treat it dynamically and to not
+	explicitly observe the object state, but rather emit the signal based on a certain condition
+*/
+
+class SignalBus{
+public:
+	//creates the signal bus
+	SignalBus();
+	~SignalBus();
+	//emits the signal based on the name. Will create a signalevent and emit it to the corresponding listeners to that event name
+	virtual void emit(string n);
+	//subscribes a listener/handler to a signal name
+	void subscribe(string n, SignalHandler* listener);
+	//unsubscribes a listener/handler from a signal name
+	void unsubscribe(string n, SignalHandler* listener);
+	//check if the signal was created in the bus or if the signal has any listeners
+	bool hasSignal(string n);
+protected:
+	//a list of signals which listed as a signal name corresponding to a list of listeners
+	map<string, vector<SignalHandler*>*> signals;
+	//sends a specific signalevent to every listener to that event name
+	virtual void sendEvent(string n, SignalEvent* event);
+	//creates a signalevent based on the signal name, which by default is the SignalDefaultEvent, but this can be extended
+	virtual SignalEvent* createSignalEvent(string n);
+};
+
+#endif

+ 39 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalEvent.cpp

@@ -0,0 +1,39 @@
+#ifndef SIGNALEVENT_CPP
+#define SIGNALEVENT_CPP
+
+#include "SignalEvent.h"
+#include "../myHelper.cpp"
+
+SignalEvent::SignalEvent(){
+	name = "";
+}
+SignalEvent::SignalEvent(string n){
+	name = n;
+}
+SignalEvent::~SignalEvent(){
+
+}
+string SignalEvent::getEventName() const{
+	return name;
+}
+
+static int CALLCOUNT = 0;
+
+SignalDefaultEvent::SignalDefaultEvent(string n):SignalEvent(n){
+	// name = n;
+	callTime = time(0);
+	callCount = CALLCOUNT++;
+}
+SignalDefaultEvent::SignalDefaultEvent(SignalDefaultEvent& other){
+	name = other.name;
+	callTime = other.callTime;
+	callCount = other.callCount;
+}
+SignalDefaultEvent::~SignalDefaultEvent(){
+
+}
+SignalEvent* SignalDefaultEvent::clone(){
+	return new SignalDefaultEvent(*this);
+}
+
+#endif

+ 52 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalEvent.h

@@ -0,0 +1,52 @@
+#ifndef SIGNALEVENT_H
+#define SIGNALEVENT_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+using namespace std;
+
+/*	
+	SignalEvent carries data and the name of the emitted event from the SignalBus to be parsed and can be extended by any other class
+	This is used to share states dynamically in the observer pattern
+*/
+
+class SignalEvent{
+public:
+	//creates signal event with the event name
+	SignalEvent(string n);
+	~SignalEvent();
+	//get event name
+	string getEventName() const;
+	//creates a copy of the signal event
+	virtual SignalEvent* clone() = 0;
+protected:
+	SignalEvent();
+	string name;
+};
+
+/*	
+	Default Event that can be used to send signals that do not need to carry additional data
+*/
+
+class SignalDefaultEvent: public SignalEvent{
+public:
+	//creates the event object
+	SignalDefaultEvent(string n);
+	//copy constructor
+	SignalDefaultEvent(SignalDefaultEvent& other);
+	~SignalDefaultEvent();
+	//clone the signal event
+	SignalEvent* clone();
+
+	time_t callTime;	//records the step time it gets called
+	int callCount;		//records the amount of times the event was called
+};
+
+#endif

+ 41 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalHandler.cpp

@@ -0,0 +1,41 @@
+#ifndef SIGNALHANDLER_CPP
+#define SIGNALHANDLER_CPP
+
+#include "SignalHandler.h"
+#include "../myHelper.cpp"
+
+/////SignalEvent
+
+/////SignalHandler
+SignalHandler::SignalHandler(){
+	id = myHelper::randomString(8);
+}
+SignalHandler::~SignalHandler(){
+	
+}
+string SignalHandler::getID() const{
+	return id;
+}
+
+FunctionHandler::FunctionHandler(function<void(SignalEvent*)> newFunc){
+	func = newFunc;
+}
+FunctionHandler::FunctionHandler(FunctionHandler& other){
+	func = other.func;
+}
+FunctionHandler::~FunctionHandler(){
+	func = NULL;
+}
+void FunctionHandler::handle(SignalEvent* event){
+	//run function
+	func(event);
+}
+/////SignalBus
+
+///ObjectSignalEvent
+
+
+///ObjectSignalBus
+
+
+#endif

+ 54 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/SignalHandler.h

@@ -0,0 +1,54 @@
+#ifndef SIGNALHANDLER_H
+#define SIGNALHANDLER_H
+
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <vector>
+#include <map>
+#include <ctime>
+
+#include <functional>
+
+#include "SignalEvent.h"
+
+using namespace std;
+
+/*	
+	SignalHandler will run a certain function whenever the signal is emitted and received, which "handles" the signal and data passed through
+	This runs or handles the state change in the observer
+*/
+
+class SignalHandler{
+public:
+	//creates the signal handler with a unique id
+	SignalHandler();
+	~SignalHandler();
+	//gets the id of handler
+	string getID() const;
+	//function used to handler the event and its data
+	virtual void handle(SignalEvent* event) = 0;
+
+private:
+	string id;
+};
+
+/*	
+	FunctionHandler is a signal handler will take a function as a paramter for contruction and use that to handle the signal instead
+*/
+
+class FunctionHandler: public SignalHandler{
+public:
+	//creates the signal handler with a function to store. Note that this is normally a function lambda
+	FunctionHandler(function<void(SignalEvent*)> newFunc);
+	//copy constructor for the handler
+	FunctionHandler(FunctionHandler& other);
+	~FunctionHandler();
+protected:
+	//function used to run the function contained to handle the event and its data
+	virtual void handle(SignalEvent* event);
+	//variable used to store the function. Function is a void type that takes a signalEvent ptr as a parameter
+	function<void(SignalEvent*)> func;
+};
+
+#endif

+ 128 - 0
CPP-Signal-Bus/CPP-Signal-Bus/SignalHandler/main.cpp

@@ -0,0 +1,128 @@
+#include <iostream>
+#include <cstdlib>
+#include <ctime>
+#include <random>
+#include <cmath>
+#include <math.h>
+
+#include <functional>
+
+#include "SignalBus.h"
+#include "ObjectSignalHandler.h"
+#include "../myHelper.cpp"
+
+
+using namespace std;
+
+class SillyEvent: public SignalEvent{
+public:
+    SillyEvent(string n, string msg):SignalEvent(n){
+        message = msg;
+    }
+    SillyEvent(SillyEvent& other){
+        name = other.name;
+        other.message = other.message;
+    }
+    ~SillyEvent(){}
+
+    SignalEvent* clone(){
+        return new SillyEvent(*this);
+    }
+
+    string getMessage() const{
+        return message;
+    }
+protected:
+    string message;
+};
+
+class SillyHandler: public SignalHandler{
+    friend class myContext;
+public:
+    SillyHandler(function<void(SillyEvent*)> f){
+        func = f;
+    }
+    ~SillyHandler(){
+
+    }
+protected:
+    function<void(SillyEvent*)> func;
+
+    virtual void handle(SignalEvent* event){
+        SillyEvent* e = static_cast<SillyEvent*>(event);
+
+        cout<<"Message is being set to "<<e->getMessage()<<endl;
+        func(e);
+    }
+};
+
+class SillySignalBus: public SignalBus{
+public:
+    SillySignalBus(){}
+    ~SillySignalBus(){}
+
+    virtual void emit(string n, string p){
+        if(hasSignal(n)){
+            vector<SignalHandler*> listeners = (*signals[n]);
+
+            SignalEvent* event = createSignalEvent(n, p);
+            sendEvent(n, event);
+        }
+    }
+    int getListenerCount(string n){
+        if(hasSignal(n)){
+            vector<SignalHandler*>* listeners = signals[n];
+            return listeners->size();
+        }
+        return 0;
+    }
+protected:
+    virtual SignalEvent* createSignalEvent(string n){
+        return new SillyEvent(n, myHelper::randomString(10));
+    }
+    virtual SignalEvent* createSignalEvent(string n, string p){
+        return new SillyEvent(n, p);
+    }
+};
+
+class myContext{
+public:
+    myContext(){
+        function<void(SignalEvent*)> f = [this](SignalEvent* e){
+            handle(e);
+        };
+        handler = new FunctionHandler(f);
+    }
+    ~myContext(){}
+
+    SignalHandler* handler;
+protected:
+    void handle(SignalEvent* _e){
+        SillyEvent* e = static_cast<SillyEvent*>(_e);
+
+        cout<<"Message: "<<e->getMessage()<<endl;
+    }
+};
+
+void signalTest(){
+   SillySignalBus* bus = new SillySignalBus();
+
+   myContext context;
+   bus->subscribe("set", context.handler);
+
+   for(int i=0; i<4; i++){
+        if(i%2==0){
+            bus->emit("set", "Mishka is old");
+        }else{
+            cout<<"Nothing at "<<i<<endl;
+        }
+   }
+
+   bus->unsubscribe("set", context.handler);
+}
+
+// int main(){
+//     signalTest();
+
+//     return 0;
+// }

+ 416 - 0
CPP-Signal-Bus/CPP-Signal-Bus/main.cpp

@@ -0,0 +1,416 @@
+// CPP-Signal-Bus.cpp : This file contains the 'main' function. Program execution begins and ends there.
+// https://github.com/catsums/CPP-Signal-Bus/tree/main
+
+
+#if 1
+
+#include <cstdlib>
+#include <ctime>
+#include <random>
+#include <cmath>
+#include <math.h>
+
+#include <functional>
+
+#include "ActionManager/ActionManager.h"
+#include "myHelper.cpp"
+
+using namespace std;
+
+int getRandomInt(int a, int b) {
+	return myHelper::uniformDistribution<int>(a, b);
+}
+
+string getRandomString(int size) {
+	return myHelper::randomString(size);
+}
+
+class myContext {
+public:
+	string name;
+	int reqCount = 5;
+	vector<ActionRequest*> requests;
+	myContext(string n) {
+		name = n;
+	}
+	~myContext() {
+
+	}
+
+	void checkRequests() {
+
+		for (int i = 0; i < (int)requests.size();i++) {
+			ActionRequest* req = requests[i];
+			if (req->getWaitCount() <= 0) {
+				requests.erase(requests.begin() + i);
+				i--;
+			}
+		}
+	}
+
+	ActionRequest* createRequest(map<string, string>& data, ActionManager* actionManager) {
+		ActionRequest* req = new ActionRequest(getRandomInt(2, 8), data, [this](SignalEvent* e) {
+			onHandle(e);
+			});
+
+		actionManager->pushRequest(req);
+
+		reqCount--;
+		requests.push_back(req);
+
+		return req;
+	}
+
+	void onProcess(ActionResult* res) {
+		res->setData("fish", name);
+	}
+
+	void onHandle(SignalEvent* e) {
+		try {
+			ActionResult* res = dynamic_cast<ActionResult*>(e);
+
+			if (res->isFinished()) {
+				if (res->isSuccess()) {
+					cout << "SUCCESS OK" << endl;
+
+					cout << "> Fishes ID:" << res->getData("fish") << endl;
+				}
+				else {
+					cout << "FAIL" << endl;
+				}
+			}
+			else {
+				cout << "Still Processing..." << endl;
+				onProcess(res);
+			}
+		}
+		catch (const bad_cast& err) {
+			cout << "Error trying to cast SignalEvent to ActionEvent" << endl;
+		}
+
+	}
+};
+
+class StepManager {
+public:
+	ActionManager actionManager;
+	vector<myContext*> arr;
+	int step = 0;
+	int maxStep = 10;
+	StepManager() {
+
+	}
+	~StepManager() {
+
+	}
+	void mainLoop() {
+		while (step < maxStep) {
+			cout << "----Step " << step << "----" << endl;
+			cout << "------------------------" << endl;
+
+			//run all requests
+			cout << ">>> Running requests" << endl;
+			while (!actionManager.isEmptyQueue()) {
+				actionManager.handleCurrRequest();
+			}
+			actionManager.placeNextQueue();
+
+			//try to get requests
+			cout << ">>> Pushing requests" << endl;
+			checkEnvironment();
+
+			step++;
+		}
+	}
+	void checkEnvironment() {
+		for (int i = 0; i < (int)arr.size();i++) {
+			myContext* ctx = arr[i];
+			int coin = getRandomInt(0, 1);
+			if (coin == 1) {
+				cout << ctx->name << " opened a request" << endl;
+				map<string, string> reqData;
+				reqData["fish"] = getRandomString(8);
+				ctx->createRequest(reqData, &actionManager);
+			}
+		}
+	}
+};
+
+void managerTest()
+{
+	StepManager manager;
+
+	manager.arr.push_back(new myContext("carp"));
+	manager.arr.push_back(new myContext("hake"));
+	manager.arr.push_back(new myContext("jellyfish"));
+
+	manager.mainLoop();
+}
+
+int main() {
+	managerTest();
+
+	return 0;
+}
+
+#else
+
+#include <iostream>
+#include <cstdlib>
+#include <ctime>
+#include <random>
+#include <cmath>
+#include <math.h>
+
+#include <functional>
+
+#include "SignalBus.h"
+#include "ObjectSignalHandler.h"
+#include "../myHelper.cpp"
+
+
+using namespace std;
+
+class SillyEvent : public SignalEvent {
+public:
+	SillyEvent(string n, string msg) :SignalEvent(n) {
+		message = msg;
+	}
+	SillyEvent(SillyEvent& other) {
+		name = other.name;
+		other.message = other.message;
+	}
+	~SillyEvent() {}
+
+	SignalEvent* clone() {
+		return new SillyEvent(*this);
+	}
+
+	string getMessage() const {
+		return message;
+	}
+protected:
+	string message;
+};
+
+class SillyHandler : public SignalHandler {
+	friend class myContext;
+public:
+	SillyHandler(function<void(SillyEvent*)> f) {
+		func = f;
+	}
+	~SillyHandler() {
+
+	}
+protected:
+	function<void(SillyEvent*)> func;
+
+	virtual void handle(SignalEvent* event) {
+		SillyEvent* e = static_cast<SillyEvent*>(event);
+
+		cout << "Message is being set to " << e->getMessage() << endl;
+		func(e);
+	}
+};
+
+class SillySignalBus : public SignalBus {
+public:
+	SillySignalBus() {}
+	~SillySignalBus() {}
+
+	virtual void emit(string n, string p) {
+		if (hasSignal(n)) {
+			vector<SignalHandler*> listeners = (*signals[n]);
+
+			SignalEvent* event = createSignalEvent(n, p);
+			sendEvent(n, event);
+		}
+	}
+	int getListenerCount(string n) {
+		if (hasSignal(n)) {
+			vector<SignalHandler*>* listeners = signals[n];
+			return listeners->size();
+		}
+		return 0;
+	}
+protected:
+	virtual SignalEvent* createSignalEvent(string n) {
+		return new SillyEvent(n, myHelper::randomString(10));
+	}
+	virtual SignalEvent* createSignalEvent(string n, string p) {
+		return new SillyEvent(n, p);
+	}
+};
+
+class myContext {
+public:
+	myContext() {
+		function<void(SignalEvent*)> f = [this](SignalEvent* e) {
+			handle(e);
+			};
+		handler = new FunctionHandler(f);
+	}
+	~myContext() {}
+
+	SignalHandler* handler;
+protected:
+	void handle(SignalEvent* _e) {
+		SillyEvent* e = static_cast<SillyEvent*>(_e);
+
+		cout << "Message: " << e->getMessage() << endl;
+	}
+};
+
+void signalTest() {
+	SillySignalBus* bus = new SillySignalBus();
+
+	myContext context;
+	bus->subscribe("set", context.handler);
+
+	for (int i = 0; i < 4; i++) {
+		if (i % 2 == 0) {
+			bus->emit("set", "Mishka is old");#include <iostream>
+#include <cstdlib>
+#include <ctime>
+#include <random>
+#include <cmath>
+#include <math.h>
+
+#include <functional>
+
+#include "SignalBus.h"
+#include "ObjectSignalHandler.h"
+#include "../myHelper.cpp"
+
+
+				using namespace std;
+
+			class SillyEvent : public SignalEvent {
+			public:
+				SillyEvent(string n, string msg) :SignalEvent(n) {
+					message = msg;
+				}
+				SillyEvent(SillyEvent& other) {
+					name = other.name;
+					other.message = other.message;
+				}
+				~SillyEvent() {}
+
+				SignalEvent* clone() {
+					return new SillyEvent(*this);
+				}
+
+				string getMessage() const {
+					return message;
+				}
+			protected:
+				string message;
+			};
+
+			class SillyHandler : public SignalHandler {
+				friend class myContext;
+			public:
+				SillyHandler(function<void(SillyEvent*)> f) {
+					func = f;
+				}
+				~SillyHandler() {
+
+				}
+			protected:
+				function<void(SillyEvent*)> func;
+
+				virtual void handle(SignalEvent* event) {
+					SillyEvent* e = static_cast<SillyEvent*>(event);
+
+					cout << "Message is being set to " << e->getMessage() << endl;
+					func(e);
+				}
+			};
+
+			class SillySignalBus : public SignalBus {
+			public:
+				SillySignalBus() {}
+				~SillySignalBus() {}
+
+				virtual void emit(string n, string p) {
+					if (hasSignal(n)) {
+						vector<SignalHandler*> listeners = (*signals[n]);
+
+						SignalEvent* event = createSignalEvent(n, p);
+						sendEvent(n, event);
+					}
+				}
+				int getListenerCount(string n) {
+					if (hasSignal(n)) {
+						vector<SignalHandler*>* listeners = signals[n];
+						return listeners->size();
+					}
+					return 0;
+				}
+			protected:
+				virtual SignalEvent* createSignalEvent(string n) {
+					return new SillyEvent(n, myHelper::randomString(10));
+				}
+				virtual SignalEvent* createSignalEvent(string n, string p) {
+					return new SillyEvent(n, p);
+				}
+			};
+
+			class myContext {
+			public:
+				myContext() {
+					function<void(SignalEvent*)> f = [this](SignalEvent* e) {
+						handle(e);
+						};
+					handler = new FunctionHandler(f);
+				}
+				~myContext() {}
+
+				SignalHandler* handler;
+			protected:
+				void handle(SignalEvent* _e) {
+					SillyEvent* e = static_cast<SillyEvent*>(_e);
+
+					cout << "Message: " << e->getMessage() << endl;
+				}
+			};
+
+			void signalTest() {
+				SillySignalBus* bus = new SillySignalBus();
+
+				myContext context;
+				bus->subscribe("set", context.handler);
+
+				for (int i = 0; i < 4; i++) {
+					if (i % 2 == 0) {
+						bus->emit("set", "Mishka is old");
+					}
+					else {
+						cout << "Nothing at " << i << endl;
+					}
+				}
+
+				bus->unsubscribe("set", context.handler);
+			}
+
+			// int main(){
+			//     signalTest();
+
+			//     return 0;
+			// }
+		}
+		else {
+			cout << "Nothing at " << i << endl;
+		}
+	}
+
+	bus->unsubscribe("set", context.handler);
+}
+
+// int main(){
+//     signalTest();
+
+//     return 0;
+// }
+
+#endif 

+ 99 - 0
CPP-Signal-Bus/CPP-Signal-Bus/myHelper.cpp

@@ -0,0 +1,99 @@
+#pragma once
+
+#include <cstdlib>
+#include <random>
+#include <cmath>
+#include <math.h>
+#include <iostream>
+#include <ctime>
+#include <string>
+#include <vector>
+
+#define M_PI 3.1413927
+
+using namespace std;
+
+class myHelper {
+public:
+
+	template <typename T>
+	static T uniformDistribution(T a, T b) {
+		T max, min;
+		if (a > b) {
+			max = a; min = b;
+		}
+		else {
+			max = b; min = a;
+		}
+		random_device rd;
+		mt19937 gen(rd());
+		uniform_real_distribution<double> distr(min, max);
+
+		return (T)distr(gen);
+	}
+	template <typename T>
+	static T normalDistribution(T u, T o) {
+		srand(time(0));
+		double u1 = uniformDistribution<double>(0.0, 1.0);
+		double u2 = uniformDistribution<double>(0.0, 1.0);
+
+		double z0 = sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2);
+		double z1 = sqrt(-2.0 * log(u1)) * sin(2.0 * M_PI * u2);
+
+		double res = z0 * o + u;
+
+		return (T)res;
+
+	}
+
+	static int randomInt(int a, int b) {
+		if (a > b) {
+			int temp = a;
+			a = b;
+			b = temp;
+		}
+		return (int)uniformDistribution<int>(a, b);
+	}
+	static int getRandomInt(int a, int b) {
+		return randomInt(a, b);
+	}
+	template <typename T>
+	static T getRandomItemFrom(vector<T> arr) {
+		int index = randomInt(0, arr.size());
+
+		return arr[index];
+	}
+	static double randomDouble(double a, double b) {
+		if (a > b) {
+			double temp = a;
+			a = b;
+			b = temp;
+		}
+		return (double)uniformDistribution<double>(a, b);
+	}
+	static string randomString(int len = 9) {
+		const char alphanum[] =
+			"0123456789"
+			"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+			"abcdefghijklmnopqrstuvwxyz";
+		int stringLen = sizeof(alphanum) - 1;
+
+		string str;
+		for (int i = 0; i < len; i++) {
+			int rnd = randomInt(0, stringLen);
+			str += alphanum[rnd % stringLen];
+		}
+		return str;
+	}
+
+	static int coinFlip() {
+		return randomInt(0, 2);
+	}
+	static int diceRoll() {
+		return randomInt(1, 7);
+	}
+	static int diceRoll(int size) {
+		return randomInt(1, size + 1);
+	}
+
+};

BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionManager.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionRequest.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ActionResult.obj


+ 11 - 0
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.exe.recipe

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project>
+  <ProjectOutputs>
+    <ProjectOutput>
+      <FullPath>C:\Users\sfreunde\source\repos\CPP-Signal-Bus\x64\Debug\CPP-Signal-Bus.exe</FullPath>
+    </ProjectOutput>
+  </ProjectOutputs>
+  <ContentFiles />
+  <SatelliteDlls />
+  <NonRecipeFileRefs />
+</Project>

BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.ilk


+ 3 - 0
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.log

@@ -0,0 +1,3 @@
+  main.cpp
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\main.cpp(87,26): warning C4101: 'err': unreferenced local variable
+  CPP-Signal-Bus.vcxproj -> C:\Users\sfreunde\source\repos\CPP-Signal-Bus\x64\Debug\CPP-Signal-Bus.exe

BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.command.1.tlog


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.read.1.tlog


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CL.write.1.tlog


+ 2 - 0
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/CPP-Signal-Bus.lastbuildstate

@@ -0,0 +1,2 @@
+PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
+Debug|x64|C:\Users\sfreunde\source\repos\CPP-Signal-Bus\|

+ 10 - 0
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/Cl.items.tlog

@@ -0,0 +1,10 @@
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\ActionManager.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\ActionManager.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\ActionRequest.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\ActionRequest.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\ActionResult.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\ActionResult.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\main.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\main.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\myHelper.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\myHelper.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\ObjectSignalBus.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\ObjectSignalBus.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\ObjectSignalEvent.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\ObjectSignalEvent.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\SignalBus.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\SignalBus.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\SignalEvent.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\SignalEvent.obj
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\SignalHandler.cpp;C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\SignalHandler.obj

BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.command.1.tlog


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.read.1.tlog


+ 2 - 0
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.secondary.1.tlog

@@ -0,0 +1,2 @@
+^C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\ACTIONMANAGER.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\ACTIONREQUEST.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\ACTIONRESULT.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\MAIN.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\MYHELPER.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\OBJECTSIGNALBUS.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\OBJECTSIGNALEVENT.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\SIGNALBUS.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\SIGNALEVENT.OBJ|C:\USERS\SFREUNDE\SOURCE\REPOS\CPP-SIGNAL-BUS\CPP-SIGNAL-BUS\X64\DEBUG\SIGNALHANDLER.OBJ
+C:\Users\sfreunde\source\repos\CPP-Signal-Bus\CPP-Signal-Bus\x64\Debug\CPP-Signal-Bus.ilk

BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.tlog/link.write.1.tlog


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ObjectSignalBus.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/ObjectSignalEvent.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalBus.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalEvent.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/SignalHandler.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/main.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/myHelper.obj


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/vc143.idb


BIN
CPP-Signal-Bus/CPP-Signal-Bus/x64/Debug/vc143.pdb


BIN
CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.exe


BIN
CPP-Signal-Bus/x64/Debug/CPP-Signal-Bus.pdb


BIN
CRTP RunTime Compile/.vs/CRTP RunTime Compile/FileContentIndex/29632633-baf1-49e3-b9d9-eafae14c3aa9.vsidx


BIN
CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/.suo


BIN
CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/Browse.VC.db


+ 37 - 0
CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/DocumentLayout.backup.json

@@ -0,0 +1,37 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{00A95E2C-3E32-4B7B-A087-2447BB90772D}|CRTP RunTime Compile\\CRTP RunTime Compile.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{00A95E2C-3E32-4B7B-A087-2447BB90772D}|CRTP RunTime Compile\\CRTP RunTime Compile.vcxproj|solutionrelative:CRTP RunTime Compile\\CRTP RunTime Compile.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 0,
+          "Children": [
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "CRTP RunTime Compile.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "RelativeDocumentMoniker": "CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "RelativeToolTip": "CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAnAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T13:26:07.269Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 37 - 0
CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/DocumentLayout.json

@@ -0,0 +1,37 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{00A95E2C-3E32-4B7B-A087-2447BB90772D}|CRTP RunTime Compile\\CRTP RunTime Compile.vcxproj|C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{00A95E2C-3E32-4B7B-A087-2447BB90772D}|CRTP RunTime Compile\\CRTP RunTime Compile.vcxproj|solutionrelative:CRTP RunTime Compile\\CRTP RunTime Compile.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 0,
+          "Children": [
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "CRTP RunTime Compile.cpp",
+              "DocumentMoniker": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "RelativeDocumentMoniker": "CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "ToolTip": "C:\\Users\\sfreunde\\source\\repos\\CRTP RunTime Compile\\CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "RelativeToolTip": "CRTP RunTime Compile\\CRTP RunTime Compile.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAQAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-29T13:26:07.269Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

BIN
CRTP RunTime Compile/.vs/CRTP RunTime Compile/v17/ipch/AutoPCH/3df2f9daddc278e3/CRTP RUNTIME COMPILE.ipch


+ 31 - 0
CRTP RunTime Compile/CRTP RunTime Compile.sln

@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.13.35931.197 d17.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CRTP RunTime Compile", "CRTP RunTime Compile\CRTP RunTime Compile.vcxproj", "{00A95E2C-3E32-4B7B-A087-2447BB90772D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Debug|x64.ActiveCfg = Debug|x64
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Debug|x64.Build.0 = Debug|x64
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Debug|x86.ActiveCfg = Debug|Win32
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Debug|x86.Build.0 = Debug|Win32
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Release|x64.ActiveCfg = Release|x64
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Release|x64.Build.0 = Release|x64
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Release|x86.ActiveCfg = Release|Win32
+		{00A95E2C-3E32-4B7B-A087-2447BB90772D}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {D13B256D-F14C-42F1-A6B1-3694AE749FA0}
+	EndGlobalSection
+EndGlobal

+ 44 - 0
CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.cpp

@@ -0,0 +1,44 @@
+// CRTP RunTime Compile.cpp : This file contains the 'main' function. Program execution begins and ends there.
+//
+
+#include <iostream>
+#include <string>
+#include <iostream>
+#include <type_traits>
+using namespace std;
+// Here's a very simple example
+
+
+template <typename T>
+struct Base {
+    void foo() {
+        (static_cast<T*>(this))->foo();
+    }
+};
+
+struct Derived : public Base<Derived> {
+    void foo() {
+        cout << "derived foo" << endl;
+    }
+};
+
+struct AnotherDerived : public Base<AnotherDerived> {
+    void foo() {
+        cout << "AnotherDerived foo" << endl;
+    }
+};
+
+template<typename T>
+void ProcessFoo(Base<T>* b) {
+    b->foo();
+}
+
+
+int main()
+{
+    Derived d1;
+    AnotherDerived d2;
+    ProcessFoo(&d1);
+    ProcessFoo(&d2);
+    return 0;
+}

+ 135 - 0
CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj

@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>17.0</VCProjectVersion>
+    <Keyword>Win32Proj</Keyword>
+    <ProjectGuid>{00a95e2c-3e32-4b7b-a087-2447bb90772d}</ProjectGuid>
+    <RootNamespace>CRTPRunTimeCompile</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v143</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="CRTP RunTime Compile.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 22 - 0
CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj.filters

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="CRTP RunTime Compile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 4 - 0
CRTP RunTime Compile/CRTP RunTime Compile/CRTP RunTime Compile.vcxproj.user

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>

BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.command.1.tlog


BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.read.1.tlog


BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CL.write.1.tlog


+ 2 - 0
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/CRTP RunTime Compile.lastbuildstate

@@ -0,0 +1,2 @@
+PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:
+Debug|x64|C:\Users\sfreunde\source\repos\CRTP RunTime Compile\|

+ 1 - 0
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/Cl.items.tlog

@@ -0,0 +1 @@
+C:\Users\sfreunde\source\repos\CRTP RunTime Compile\CRTP RunTime Compile\CRTP RunTime Compile.cpp;C:\Users\sfreunde\source\repos\CRTP RunTime Compile\CRTP RunTime Compile\x64\Debug\CRTP RunTime Compile.obj

BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.command.1.tlog


BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.read.1.tlog


+ 2 - 0
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.secondary.1.tlog

@@ -0,0 +1,2 @@
+^C:\USERS\SFREUNDE\SOURCE\REPOS\CRTP RUNTIME COMPILE\CRTP RUNTIME COMPILE\X64\DEBUG\CRTP RUNTIME COMPILE.OBJ
+C:\Users\sfreunde\source\repos\CRTP RunTime Compile\CRTP RunTime Compile\x64\Debug\CRTP RunTime Compile.ilk

BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP Run.00a95e2c.tlog/link.write.1.tlog


+ 11 - 0
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.exe.recipe

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project>
+  <ProjectOutputs>
+    <ProjectOutput>
+      <FullPath>C:\Users\sfreunde\source\repos\CRTP RunTime Compile\x64\Debug\CRTP RunTime Compile.exe</FullPath>
+    </ProjectOutput>
+  </ProjectOutputs>
+  <ContentFiles />
+  <SatelliteDlls />
+  <NonRecipeFileRefs />
+</Project>

BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.ilk


+ 2 - 0
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.log

@@ -0,0 +1,2 @@
+  CRTP RunTime Compile.cpp
+  CRTP RunTime Compile.vcxproj -> C:\Users\sfreunde\source\repos\CRTP RunTime Compile\x64\Debug\CRTP RunTime Compile.exe

BIN
CRTP RunTime Compile/CRTP RunTime Compile/x64/Debug/CRTP RunTime Compile.obj


Неке датотеке нису приказане због велике количине промена