Jelajahi Sumber

new examples

sfxsfl 8 bulan lalu
induk
melakukan
53249f43de
100 mengubah file dengan 2511 tambahan dan 0 penghapusan
  1. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/CopilotIndices/17.13.444.19527/CodeChunks.db
  2. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/CopilotIndices/17.13.444.19527/SemanticSymbols.db
  3. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/17019875-7730-45f4-9813-d2e77139c321.vsidx
  4. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/3288bc85-a4e8-422b-851b-29eb7007f144.vsidx
  5. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/354d620f-310c-466c-932d-169bbe54b640.vsidx
  6. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/add100c3-7483-4399-b9c4-01d363baf2fe.vsidx
  7. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/c2a8008e-b22d-4489-a160-3db6c764bb4c.vsidx
  8. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/copilot-chat/48988cf4/sessions/6d906cc3-64a2-46f5-a807-75d72a9adc28
  9. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/copilot-chat/48988cf4/sessions/c1e341a1-2db9-4b41-a221-78b6b34e5ec3
  10. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/.suo
  11. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/Browse.VC.db
  12. 62 0
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/DocumentLayout.backup.json
  13. 62 0
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/DocumentLayout.json
  14. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/Solution.VC.db
  15. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/2651faeab8a79ecc/TMP9235.TMP.ipch
  16. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/b534388832c3bb91/TMPB174.TMP.ipch
  17. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/bad9e9222a23daa0/TMP70AC.TMP.ipch
  18. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/bf99dbb87621ba6d/TMP1E4D.TMP.ipch
  19. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/e22b905d326a98a4/TMP1A58.TMP.ipch
  20. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/f2654cfd6517160f/SIGNALS AND SLOTS IN 100 LINES.ipch
  21. TEMPAT SAMPAH
      Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/f65cc4100c39100e/SIGNALSLOT.ipch
  22. 31 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines.sln
  23. 101 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.cpp
  24. 138 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.vcxproj
  25. 27 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.vcxproj.filters
  26. 4 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.vcxproj.user
  27. 234 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/signalslot.h
  28. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.command.1.tlog
  29. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.read.1.tlog
  30. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.write.1.tlog
  31. 1 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/Cl.items.tlog
  32. 2 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/Signals and Slots in 100 lines.lastbuildstate
  33. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.command.1.tlog
  34. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.read.1.tlog
  35. 2 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.secondary.1.tlog
  36. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.write.1.tlog
  37. 11 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.exe.recipe
  38. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.ilk
  39. 31 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.log
  40. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.obj
  41. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vc143.idb
  42. TEMPAT SAMPAH
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vc143.pdb
  43. 1 0
      Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vcpkg.applocal.log
  44. TEMPAT SAMPAH
      Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.exe
  45. TEMPAT SAMPAH
      Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.pdb
  46. TEMPAT SAMPAH
      Signals/.vs/Signals/CopilotIndices/17.13.444.19527/CodeChunks.db
  47. TEMPAT SAMPAH
      Signals/.vs/Signals/CopilotIndices/17.13.444.19527/SemanticSymbols.db
  48. TEMPAT SAMPAH
      Signals/.vs/Signals/FileContentIndex/5e2bfa67-d22f-4a01-9c7c-98f46a8d2e0e.vsidx
  49. TEMPAT SAMPAH
      Signals/.vs/Signals/v17/.suo
  50. TEMPAT SAMPAH
      Signals/.vs/Signals/v17/Browse.VC.db
  51. 45 0
      Signals/.vs/Signals/v17/DocumentLayout.backup.json
  52. 45 0
      Signals/.vs/Signals/v17/DocumentLayout.json
  53. TEMPAT SAMPAH
      Signals/.vs/Signals/v17/ipch/AutoPCH/bc7e5e260c25cec9/SIGNALS.ipch
  54. 31 0
      Signals/Signals.sln
  55. 557 0
      Signals/Signals/Signals.cpp
  56. 135 0
      Signals/Signals/Signals.vcxproj
  57. 22 0
      Signals/Signals/Signals.vcxproj.filters
  58. 4 0
      Signals/Signals/Signals.vcxproj.user
  59. 98 0
      Signals/Signals/x64/Debug/Signals.log
  60. 1 0
      Signals/Signals/x64/Debug/Signals.tlog/CL.command.1.tlog
  61. 2 0
      Signals/Signals/x64/Debug/Signals.tlog/Signals.lastbuildstate
  62. 0 0
      Signals/Signals/x64/Debug/Signals.tlog/unsuccessfulbuild
  63. TEMPAT SAMPAH
      Signals/Signals/x64/Debug/vc143.idb
  64. TEMPAT SAMPAH
      Signals/Signals/x64/Debug/vc143.pdb
  65. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/CopilotIndices/17.13.444.19527/CodeChunks.db
  66. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/CopilotIndices/17.13.444.19527/SemanticSymbols.db
  67. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/FileContentIndex/4dd69da5-f412-4406-a8e4-74d0d8492422.vsidx
  68. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/FileContentIndex/c64ee106-44e2-4bb7-b0ce-b12ac3ef39e4.vsidx
  69. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/v17/.suo
  70. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/v17/Browse.VC.db
  71. 62 0
      SimpleSignal/.vs/SimpleSignal/v17/DocumentLayout.backup.json
  72. 62 0
      SimpleSignal/.vs/SimpleSignal/v17/DocumentLayout.json
  73. TEMPAT SAMPAH
      SimpleSignal/.vs/SimpleSignal/v17/ipch/AutoPCH/a311fe2717716c83/SIMPLESIGNAL.ipch
  74. 31 0
      SimpleSignal/SimpleSignal.sln
  75. 255 0
      SimpleSignal/SimpleSignal/SimpleSignal.cpp
  76. 226 0
      SimpleSignal/SimpleSignal/SimpleSignal.h
  77. 138 0
      SimpleSignal/SimpleSignal/SimpleSignal.vcxproj
  78. 27 0
      SimpleSignal/SimpleSignal/SimpleSignal.vcxproj.filters
  79. 4 0
      SimpleSignal/SimpleSignal/SimpleSignal.vcxproj.user
  80. 11 0
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.exe.recipe
  81. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.ilk
  82. 42 0
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.log
  83. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.obj
  84. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.command.1.tlog
  85. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.read.1.tlog
  86. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.write.1.tlog
  87. 1 0
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/Cl.items.tlog
  88. 2 0
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/SimpleSignal.lastbuildstate
  89. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.command.1.tlog
  90. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.read.1.tlog
  91. 2 0
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.secondary.1.tlog
  92. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.write.1.tlog
  93. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/vc143.idb
  94. TEMPAT SAMPAH
      SimpleSignal/SimpleSignal/x64/Debug/vc143.pdb
  95. 1 0
      SimpleSignal/SimpleSignal/x64/Debug/vcpkg.applocal.log
  96. TEMPAT SAMPAH
      SimpleSignal/x64/Debug/SimpleSignal.exe
  97. TEMPAT SAMPAH
      SimpleSignal/x64/Debug/SimpleSignal.pdb
  98. TEMPAT SAMPAH
      Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/CopilotIndices/17.13.444.19527/CodeChunks.db
  99. TEMPAT SAMPAH
      Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/CopilotIndices/17.13.444.19527/SemanticSymbols.db
  100. TEMPAT SAMPAH
      Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/FileContentIndex/b0e40f97-811d-47e2-81ae-8b13a549321f.vsidx

TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/CopilotIndices/17.13.444.19527/CodeChunks.db


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/CopilotIndices/17.13.444.19527/SemanticSymbols.db


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/17019875-7730-45f4-9813-d2e77139c321.vsidx


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/3288bc85-a4e8-422b-851b-29eb7007f144.vsidx


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/354d620f-310c-466c-932d-169bbe54b640.vsidx


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/add100c3-7483-4399-b9c4-01d363baf2fe.vsidx


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/FileContentIndex/c2a8008e-b22d-4489-a160-3db6c764bb4c.vsidx


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/copilot-chat/48988cf4/sessions/6d906cc3-64a2-46f5-a807-75d72a9adc28


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/copilot-chat/48988cf4/sessions/c1e341a1-2db9-4b41-a221-78b6b34e5ec3


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/.suo


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/Browse.VC.db


+ 62 - 0
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/DocumentLayout.backup.json

@@ -0,0 +1,62 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|solutionrelative:Signals and Slots in 100 lines\\signalslot.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|solutionrelative:Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 2,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "signalslot.h",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h",
+              "RelativeDocumentMoniker": "Signals and Slots in 100 lines\\signalslot.h",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h",
+              "RelativeToolTip": "Signals and Slots in 100 lines\\signalslot.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAFAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-28T13:05:43.414Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "Signals and Slots in 100 lines.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "RelativeDocumentMoniker": "Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "RelativeToolTip": "Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAACkAAAAaAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-28T13:04:30.252Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 62 - 0
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/DocumentLayout.json

@@ -0,0 +1,62 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|solutionrelative:Signals and Slots in 100 lines\\signalslot.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}|Signals and Slots in 100 lines\\Signals and Slots in 100 lines.vcxproj|solutionrelative:Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 2,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "signalslot.h",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h",
+              "RelativeDocumentMoniker": "Signals and Slots in 100 lines\\signalslot.h",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\signalslot.h",
+              "RelativeToolTip": "Signals and Slots in 100 lines\\signalslot.h",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAFAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-28T13:05:43.414Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "Signals and Slots in 100 lines.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "RelativeDocumentMoniker": "Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "RelativeToolTip": "Signals and Slots in 100 lines\\Signals and Slots in 100 lines.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAACkAAAAaAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-28T13:04:30.252Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/Solution.VC.db


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/2651faeab8a79ecc/TMP9235.TMP.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/b534388832c3bb91/TMPB174.TMP.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/bad9e9222a23daa0/TMP70AC.TMP.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/bf99dbb87621ba6d/TMP1E4D.TMP.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/e22b905d326a98a4/TMP1A58.TMP.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/f2654cfd6517160f/SIGNALS AND SLOTS IN 100 LINES.ipch


TEMPAT SAMPAH
Signals and Slots in 100 lines/.vs/Signals and Slots in 100 lines/v17/ipch/AutoPCH/f65cc4100c39100e/SIGNALSLOT.ipch


+ 31 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines.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}") = "Signals and Slots in 100 lines", "Signals and Slots in 100 lines\Signals and Slots in 100 lines.vcxproj", "{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}"
+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
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Debug|x64.ActiveCfg = Debug|x64
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Debug|x64.Build.0 = Debug|x64
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Debug|x86.ActiveCfg = Debug|Win32
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Debug|x86.Build.0 = Debug|Win32
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Release|x64.ActiveCfg = Release|x64
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Release|x64.Build.0 = Release|x64
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Release|x86.ActiveCfg = Release|Win32
+		{E92BBBBE-7DBE-4DCB-886B-55A48A7996A0}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {19B92E07-2392-45D1-88FF-0BC0F750D2EC}
+	EndGlobalSection
+EndGlobal

+ 101 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.cpp

@@ -0,0 +1,101 @@
+// Signals and Slots in 100 lines.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.
+//
+// https://github.com/HeranGa0/Signals-and-Slots-in-100-lines-Cpp-code/tree/master
+
+#include "signalslot.h"
+#include <iostream>
+#include <map>
+#include <functional>
+#include <string>	
+#include <type_traits>
+#include <tuple>
+#include <utility>
+#include <vector>
+#include <algorithm>
+
+
+class Object  
+{  
+public:
+	Object() = default;
+	~Object() = default;  
+
+	//signal for num  
+	void numChanged(int a, int b, int c)  
+	{  
+		std::cout << "emit num Signal!" << std::endl;  
+	}  
+
+	void setNum(int a, int b, int c)  
+	{  
+		//will emit signal numchanged when call this function  
+		emitWithParam(numChanged, (a, b, c), (a, b, c));  
+	}  
+	//slot for num  
+	int numSlot(int a, int b, int c) {  
+		std::cout << "parent num slot recieved!" << endl << a << b << c << std::endl;  
+		return 0;  
+	}  
+	//signal for string  
+	void stringChanged(std::string s)  
+	{  
+		std::cout << s << " emit string Signal!" << std::endl;  
+	}  
+
+	void setString(std::string s)  
+	{  
+		//emit signal stringChanged when call this function  
+		emitWithParam(stringChanged, (s), (s));  
+	}  
+};
+
+class Child : public Object
+{
+public:
+	//slot for string
+	int stringSlot(std::string str)
+	{
+		std::cout << "child slot recieved! " << str << std::endl;
+		return 0;
+	}
+};
+
+int main()
+{
+	Object obj1;
+	Object obj2;
+	Child c1;
+	Child c2;
+
+	//connect the signal numchanged in obj1 to the num slot in obj2
+	connect(&obj1, &Object::numChanged, &obj2, &Object::numSlot);
+
+	//connect the signal stringChanged in the parent object obj2 to the child slot in c1 
+ 	connect(&obj2, &Object::stringChanged, &c1, &Child::stringSlot);
+
+	//connect the signal stringChanged in the parent object obj2 to the child slot in c1 
+	connect(&c2, &Child::stringSlot, &c1, &Child::stringSlot);
+
+#if 0
+	#define STRINGIZE(x) #x
+	auto omfunc1 = &Object::stringChanged;
+	auto omfunc2 = &Child::stringSlot;
+	auto obj_ptr1 = &obj2;
+	auto obj_ptr2 = &c1;
+	auto mfptr1 = &Object::stringChanged;
+	auto mfptr2 = &Child::stringSlot;
+    auto cast_mid_mfptr1 = (void (std::remove_reference<decltype(*obj_ptr1)>::type::*)())(mfptr1);
+	auto cast_mfptr1 = omfptr(cast_mid_mfptr1); 
+	auto cast_mid_mfptr2 = (void (std::remove_reference<decltype(*obj_ptr2)>::type ::*)())(mfptr2); 
+	auto cast_mfptr2 = omfptr(cast_mid_mfptr2); 
+	auto m1 = new DPointer(cast_mfptr1); 
+	auto m2 = new DPointer(cast_mfptr2); 
+	_map.insert(make_pair(std::make_pair(std::make_pair(STRINGIZE(omfunc1), m1), obj_ptr1), std::make_pair(std::make_pair(STRINGIZE(omfunc2), m2), obj_ptr2)));
+#endif 
+	
+	//setNum  will emit signal numChanged and numSlot will recieve it and be called
+	obj1.setNum(1, 3, 4);
+	//setString will emit stringChanged signal and stringSlot will recieve it and be called
+	obj2.setString("whereamI");
+	return 0;
+}

+ 138 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.vcxproj

@@ -0,0 +1,138 @@
+<?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>{e92bbbbe-7dbe-4dcb-886b-55a48a7996a0}</ProjectGuid>
+    <RootNamespace>SignalsandSlotsin100lines</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="Signals and Slots in 100 lines.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="signalslot.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 27 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.vcxproj.filters

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <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="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <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="Signals and Slots in 100 lines.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="signalslot.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 4 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/Signals and Slots in 100 lines.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>

+ 234 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/signalslot.h

@@ -0,0 +1,234 @@
+#pragma once
+#include<iostream>
+#include<map>
+#include <functional>
+#include<string>
+#include<type_traits>
+#include<tuple>
+
+#if 1
+
+using namespace std;
+class Object;
+using omfptr = void(Object::*)();
+
+class MPointer
+{
+public:
+	virtual void sendback(Object* optr) = 0;
+	virtual omfptr get_mfptr() = 0;
+	bool operator< (const MPointer& rhs) const
+	{
+		return true;
+	}
+};
+
+class DPointer :public MPointer
+{
+public:
+	DPointer(void(Object::* mfptr)()) :_mfptr(mfptr) {}
+	void(Object::* _mfptr)();
+	virtual void sendback(Object* optr)override
+	{
+		(optr->*_mfptr)();
+	}
+
+	virtual omfptr get_mfptr() override
+	{
+		return omfptr(_mfptr);
+	}
+};
+
+template<int ...>
+struct seq {};
+
+template<int N, int ...S>
+struct gens : gens<N - 1, N - 1, S...> {};
+
+template<int ...S>
+struct gens<0, S...> {
+	typedef seq<S...> type;
+};
+
+template<int ...S, typename T, typename... Types>
+void callFunc(seq<S...>, const T& tuple, MPointer* mptr, Object* optr, std::tuple<Types...>& ty) {
+	auto mfptr = mptr->get_mfptr();
+	auto cast_omfptr = (void (Object::*)(Types...))mfptr;
+	(optr->*cast_omfptr)(std::get<S>(tuple) ...);
+}
+
+template<typename T, typename... Types>
+void delayed_dispatch(const T& tup, MPointer* mptr, Object* optr, std::tuple<Types...>& ty) {
+	callFunc(typename gens<std::tuple_size<T>::value >::type(), tup, mptr, optr, ty);
+}
+
+std::map<std::pair<std::pair<std::string, MPointer*>, Object*>, std::pair<std::pair<std::string, MPointer*>, Object*>> _map;
+
+
+#if 0
+#define connect(obj_ptr1,omfunc1,obj_ptr2,omfunc2)\
+do{\
+auto mfptr1=omfunc1;\
+auto mfptr2=omfunc2;\
+auto cast_mid_mfptr1=(void (std::remove_reference<decltype(*obj_ptr2)>::type ::*)())(mfptr1);\
+auto cast_mfptr1=omfptr(cast_mid_mfptr1);\
+auto cast_mid_mfptr2=(void (std::remove_reference<decltype(*obj_ptr2)>::type ::*)())(mfptr2);\
+auto cast_mfptr2=omfptr(cast_mid_mfptr2);\
+auto m1=new DPointer(cast_mfptr1);\
+auto m2=new DPointer(cast_mfptr2);\
+_map.insert(make_pair(std::make_pair(std::make_pair(#omfunc1,m1),obj_ptr1),std::make_pair(std::make_pair(#omfunc2,m2),obj_ptr2)));}\
+while(0);
+#else
+#define connect(obj_ptr1,omfunc1,obj_ptr2,omfunc2)\
+do{\
+auto mfptr1=omfunc1;\
+auto mfptr2=omfunc2;\
+auto cast_mid_mfptr1=(void (std::remove_reference<decltype(*obj_ptr1)>::type ::*)())(mfptr1);\
+auto cast_mfptr1=omfptr(cast_mid_mfptr1);\
+auto cast_mid_mfptr2=(void (std::remove_reference<decltype(*obj_ptr2)>::type ::*)())(mfptr2);\
+auto cast_mfptr2=omfptr(cast_mid_mfptr2);\
+auto m1=new DPointer(cast_mfptr1);\
+auto m2=new DPointer(cast_mfptr2);\
+_map.insert(make_pair(std::make_pair(std::make_pair(#omfunc1,m1),obj_ptr1),std::make_pair(std::make_pair(#omfunc2,m2),obj_ptr2)));}\
+while(0);
+#endif 
+
+#define emit(func)\
+do{\
+func();\
+for(auto _outPair:_map){\
+std::size_t pos=_outPair.first.first.first.rfind("::");\
+std::string funcName=_outPair.first.first.first.substr(pos+2);\
+if((funcName==#func)&&(_outPair.first.second==this)){\
+_outPair.second.first.second->sendback(_outPair.second.second);}}}\
+while(0);
+auto t = std::make_tuple(10, 20);
+
+#define emitWithParam(func,signalArgs,slotsArgs)\
+do{\
+func signalArgs ;\
+auto tuple = std::make_tuple slotsArgs ;\
+for(auto _outPair:_map){\
+std::size_t pos=_outPair.first.first.first.rfind("::");\
+std::string funcName=_outPair.first.first.first.substr(pos+2);\
+if((funcName==#func)&&(_outPair.first.second==this)){\
+delayed_dispatch(tuple,_outPair.second.first.second,_outPair.second.second,tuple);\
+}}}\
+while(0);
+
+
+#else
+
+// https://github.com/HeranGa0/Signals-and-Slots-in-100-lines-Cpp-code/tree/master
+
+using namespace std;
+class cBaseGraphics;
+using omfptr = void (cBaseGraphics::*)();
+
+class MPointer
+{
+public:
+    virtual void sendback(cBaseGraphics* optr) = 0;
+    virtual omfptr get_mfptr() = 0;
+    bool operator<(const MPointer& rhs) const
+    {
+        return true;
+    }
+};
+
+class DPointer : public MPointer
+{
+public:
+    DPointer(void (cBaseGraphics::* mfptr)()) : _mfptr(mfptr) {}
+    void (cBaseGraphics::* _mfptr)();
+    virtual void sendback(cBaseGraphics* optr) override
+    {
+        (optr->*_mfptr)();
+    }
+
+    virtual omfptr get_mfptr() override
+    {
+        return omfptr(_mfptr);
+    }
+};
+
+template <int...>
+struct seq
+{
+};
+
+template <int N, int... S>
+struct gens : gens<N - 1, N - 1, S...>
+{
+};
+
+template <int... S>
+struct gens<0, S...>
+{
+    typedef seq<S...> type;
+};
+
+template <int... S, typename T, typename... Types>
+void callFunc(seq<S...>, const T& tuple, MPointer* mptr, cBaseGraphics* optr, std::tuple<Types...>& ty)
+{
+    auto mfptr = mptr->get_mfptr();
+    auto cast_omfptr = (void (cBaseGraphics::*)(Types...))mfptr;
+    (optr->*cast_omfptr)(std::get<S>(tuple)...);
+}
+
+template <typename T, typename... Types>
+void delayed_dispatch(const T& tup, MPointer* mptr, cBaseGraphics* optr, std::tuple<Types...>& ty)
+{
+    callFunc(typename gens<std::tuple_size<T>::value>::type(), tup, mptr, optr, ty);
+}
+
+std::map<std::pair<std::pair<std::string, MPointer*>, cBaseGraphics*>, std::pair<std::pair<std::string, MPointer*>, cBaseGraphics*>> _map;
+
+#define connect(obj_ptr1, omfunc1, obj_ptr2, omfunc2)                                                                                           \
+    do                                                                                                                                          \
+    {                                                                                                                                           \
+        auto mfptr1 = omfunc1;                                                                                                                  \
+        auto mfptr2 = omfunc2;                                                                                                                  \
+        auto cast_mid_mfptr1 = (void (std::remove_reference<decltype(*obj_ptr1)>::type ::*)())(mfptr1);                                         \
+        auto cast_mfptr1 = omfptr(cast_mid_mfptr1);                                                                                             \
+        auto cast_mid_mfptr2 = (void (std::remove_reference<decltype(*obj_ptr2)>::type ::*)())(mfptr2);                                         \
+        auto cast_mfptr2 = omfptr(cast_mid_mfptr2);                                                                                             \
+        auto m1 = new DPointer(cast_mfptr1);                                                                                                    \
+        auto m2 = new DPointer(cast_mfptr2);                                                                                                    \
+        _map.insert(make_pair(std::make_pair(std::make_pair(#omfunc1, m1), obj_ptr1), std::make_pair(std::make_pair(#omfunc2, m2), obj_ptr2))); \
+    } while (0);
+
+#define emit(func)                                                              \
+    do                                                                          \
+    {                                                                           \
+        func();                                                                 \
+        for (auto _outPair : _map)                                              \
+        {                                                                       \
+            std::size_t pos = _outPair.first.first.first.rfind("::");           \
+            std::string funcName = _outPair.first.first.first.substr(pos + 2);  \
+            if ((funcName == #func) && (_outPair.first.second == this))         \
+            {                                                                   \
+                _outPair.second.first.second->sendback(_outPair.second.second); \
+            }                                                                   \
+        }                                                                       \
+    } while (0);
+
+auto t = std::make_tuple(10, 20);
+
+#define emitWithParam(func, signalArgs, slotsArgs)                                                    \
+    do                                                                                                \
+    {                                                                                                 \
+        func signalArgs;                                                                              \
+        auto tuple = std::make_tuple slotsArgs;                                                       \
+        for (auto _outPair : _map)                                                                    \
+        {                                                                                             \
+            std::size_t pos = _outPair.first.first.first.rfind("::");                                 \
+            std::string funcName = _outPair.first.first.first.substr(pos + 2);                        \
+            if ((funcName == #func) && (_outPair.first.second == this))                               \
+            {                                                                                         \
+                delayed_dispatch(tuple, _outPair.second.first.second, _outPair.second.second, tuple); \
+            }                                                                                         \
+        }                                                                                             \
+    } while (0);
+
+#endif

TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.command.1.tlog


TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.read.1.tlog


TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/CL.write.1.tlog


+ 1 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/Cl.items.tlog

@@ -0,0 +1 @@
+C:\Users\wruser\source\repos\Signals and Slots in 100 lines\Signals and Slots in 100 lines\Signals and Slots in 100 lines.cpp;C:\Users\wruser\source\repos\Signals and Slots in 100 lines\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.obj

+ 2 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/Signals and Slots in 100 lines.lastbuildstate

@@ -0,0 +1,2 @@
+PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:VcpkgTriplet=x64-windows:
+Debug|x64|C:\Users\wruser\source\repos\Signals and Slots in 100 lines\|

TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.command.1.tlog


TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.read.1.tlog


+ 2 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.secondary.1.tlog

@@ -0,0 +1,2 @@
+^C:\USERS\WRUSER\SOURCE\REPOS\SIGNALS AND SLOTS IN 100 LINES\SIGNALS AND SLOTS IN 100 LINES\X64\DEBUG\SIGNALS AND SLOTS IN 100 LINES.OBJ
+C:\Users\wruser\source\repos\Signals and Slots in 100 lines\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.ilk

TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals .e92bbbbe.tlog/link.write.1.tlog


+ 11 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.exe.recipe

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project>
+  <ProjectOutputs>
+    <ProjectOutput>
+      <FullPath>C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe</FullPath>
+    </ProjectOutput>
+  </ProjectOutputs>
+  <ContentFiles />
+  <SatelliteDlls />
+  <NonRecipeFileRefs />
+</Project>

TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.ilk


+ 31 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.log

@@ -0,0 +1,31 @@
+Der Buildvorgang wurde am 28.04.2025 18:28:01 gestartet.
+Die Ausführlichkeit der Protokollierung ist auf "Normal" festgelegt.     1>Projekt "C:\Users\wruser\source\repos\Signals and Slots in 100 lines\Signals and Slots in 100 lines\Signals and Slots in 100 lines.vcxproj" auf Knoten "2", Build Ziel(e).
+     1>PrepareForBuild:
+         Die strukturierte Ausgabe ist aktiviert. Die Formatierung der Compilerdiagnose spiegelt die Fehlerhierarchie wider. Weitere Informationen finden Sie unter https://aka.ms/cpp/structured-output.
+       InitializeBuildStatus:
+         Aktualisieren des Timestamps von "x64\Debug\Signals .e92bbbbe.tlog\unsuccessfulbuild".
+       VcpkgTripletSelection:
+         Using triplet "x64-windows" from "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\"
+         Using normalized configuration "Debug"
+       ClCompile:
+         D:\Programme\VS2022\VC\Tools\MSVC\14.43.34808\bin\HostX64\x64\CL.exe /c /I"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\include" /ZI /JMC /nologo /W3 /WX- /diagnostics:column /sdl /Od /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /permissive- /Fo"x64\Debug\\" /Fd"x64\Debug\vc143.pdb" /external:W3 /Gd /TP /FC /errorReport:prompt "Signals and Slots in 100 lines.cpp"
+         Signals and Slots in 100 lines.cpp
+       Link:
+         D:\Programme\VS2022\VC\Tools\MSVC\14.43.34808\bin\HostX64\x64\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe" /INCREMENTAL /ILK:"x64\Debug\Signals and Slots in 100 lines.ilk" /NOLOGO /LIBPATH:"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib" /LIBPATH:"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib\manual-link" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib\*.lib" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.lib" /MACHINE:X64 "x64\Debug\Signals and Slots in 100 lines.obj"
+         Signals and Slots in 100 lines.vcxproj -> C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe
+       AppLocalFromInstalled:
+         pwsh.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\Signals .e92bbbbe.tlog\Signals and Slots in 100 lines.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
+         Der Befehl "pwsh.exe" ist entweder falsch geschrieben oder
+         konnte nicht gefunden werden.
+         Der Befehl "pwsh.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\Signals .e92bbbbe.tlog\Signals and Slots in 100 lines.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"" wurde mit dem Code 9009 beendet.
+         "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\Signals and Slots in 100 lines\x64\Debug\Signals and Slots in 100 lines.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\Signals .e92bbbbe.tlog\Signals and Slots in 100 lines.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
+       FinalizeBuildStatus:
+         Die Datei "x64\Debug\Signals .e92bbbbe.tlog\unsuccessfulbuild" wird gelöscht.
+         Aktualisieren des Timestamps von "x64\Debug\Signals .e92bbbbe.tlog\Signals and Slots in 100 lines.lastbuildstate".
+     1>Die Erstellung von Projekt "C:\Users\wruser\source\repos\Signals and Slots in 100 lines\Signals and Slots in 100 lines\Signals and Slots in 100 lines.vcxproj" ist abgeschlossen (Build Ziel(e)).
+
+Der Buildvorgang wurde erfolgreich ausgeführt.
+    0 Warnung(en)
+    0 Fehler
+
+Verstrichene Zeit 00:00:02.49

TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.obj


TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vc143.idb


TEMPAT SAMPAH
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vc143.pdb


+ 1 - 0
Signals and Slots in 100 lines/Signals and Slots in 100 lines/x64/Debug/vcpkg.applocal.log

@@ -0,0 +1 @@
+

TEMPAT SAMPAH
Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.exe


TEMPAT SAMPAH
Signals and Slots in 100 lines/x64/Debug/Signals and Slots in 100 lines.pdb


TEMPAT SAMPAH
Signals/.vs/Signals/CopilotIndices/17.13.444.19527/CodeChunks.db


TEMPAT SAMPAH
Signals/.vs/Signals/CopilotIndices/17.13.444.19527/SemanticSymbols.db


TEMPAT SAMPAH
Signals/.vs/Signals/FileContentIndex/5e2bfa67-d22f-4a01-9c7c-98f46a8d2e0e.vsidx


TEMPAT SAMPAH
Signals/.vs/Signals/v17/.suo


TEMPAT SAMPAH
Signals/.vs/Signals/v17/Browse.VC.db


+ 45 - 0
Signals/.vs/Signals/v17/DocumentLayout.backup.json

@@ -0,0 +1,45 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\Signals\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{45D6F807-D85B-47E1-8D2F-8874004F6681}|Signals\\Signals.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{45D6F807-D85B-47E1-8D2F-8874004F6681}|Signals\\Signals.vcxproj|solutionrelative:Signals\\Signals.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 2,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "Signals.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp",
+              "RelativeDocumentMoniker": "Signals\\Signals.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp",
+              "RelativeToolTip": "Signals\\Signals.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-26T18:25:16.956Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 45 - 0
Signals/.vs/Signals/v17/DocumentLayout.json

@@ -0,0 +1,45 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\Signals\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{45D6F807-D85B-47E1-8D2F-8874004F6681}|Signals\\Signals.vcxproj|C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{45D6F807-D85B-47E1-8D2F-8874004F6681}|Signals\\Signals.vcxproj|solutionrelative:Signals\\Signals.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 2,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "Signals.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp",
+              "RelativeDocumentMoniker": "Signals\\Signals.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\Signals\\Signals\\Signals.cpp",
+              "RelativeToolTip": "Signals\\Signals.cpp",
+              "ViewState": "AgIAAB4AAAAAAAAAAAAkwC4AAAAKAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-26T18:25:16.956Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

TEMPAT SAMPAH
Signals/.vs/Signals/v17/ipch/AutoPCH/bc7e5e260c25cec9/SIGNALS.ipch


+ 31 - 0
Signals/Signals.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}") = "Signals", "Signals\Signals.vcxproj", "{45D6F807-D85B-47E1-8D2F-8874004F6681}"
+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
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Debug|x64.ActiveCfg = Debug|x64
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Debug|x64.Build.0 = Debug|x64
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Debug|x86.ActiveCfg = Debug|Win32
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Debug|x86.Build.0 = Debug|Win32
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Release|x64.ActiveCfg = Release|x64
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Release|x64.Build.0 = Release|x64
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Release|x86.ActiveCfg = Release|Win32
+		{45D6F807-D85B-47E1-8D2F-8874004F6681}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {B3D8D859-9434-49BB-BFD3-F05FF20493AF}
+	EndGlobalSection
+EndGlobal

+ 557 - 0
Signals/Signals/Signals.cpp

@@ -0,0 +1,557 @@
+// CC0 Public Domain: http://creativecommons.org/publicdomain/zero/1.0/
+// https://testbit.eu/~timj/blogstuff/simplesignal.cc
+// https://testbit.eu/2013/cpp11-signal-system-performance
+
+
+#ifndef __SIMPLE_SIGNAL_HH__
+#define __SIMPLE_SIGNAL_HH__
+
+#ifdef _WIN32
+#include <io.h>
+#define access _access
+
+#else
+#include <unistd.h>
+#endif
+
+#include <assert.h>
+#include <stdint.h>
+#include <functional>
+#include <vector>
+
+namespace Simple {
+
+    namespace Lib {
+
+        /// ProtoSignal is the template implementation for callback list.
+        template<typename, typename> class ProtoSignal;   // undefined
+
+        /// CollectorInvocation invokes signal handlers differently depending on return type.
+        template<typename, typename> class CollectorInvocation;
+
+        /// CollectorLast returns the result of the last signal handler from a signal emission.
+        template<typename Result>
+        struct CollectorLast {
+            typedef Result CollectorResult;
+            explicit        CollectorLast() : last_() {}
+            inline bool     operator()    (Result r) { last_ = r; return true; }
+            CollectorResult result() { return last_; }
+        private:
+            Result last_;
+        };
+
+        /// CollectorDefault implements the default signal handler collection behaviour.
+        template<typename Result>
+        struct CollectorDefault : CollectorLast<Result>
+        {
+        };
+
+        /// CollectorDefault specialisation for signals with void return type.
+        template<>
+        struct CollectorDefault<void> {
+            typedef void CollectorResult;
+            void                  result() {}
+            inline bool           operator() (void) { return true; }
+        };
+
+        /// CollectorInvocation specialisation for regular signals.
+        template<class Collector, class R, class... Args>
+        struct CollectorInvocation<Collector, R(Args...)> {
+            inline bool
+                invoke(Collector& collector, const std::function<R(Args...)>& cbf, Args... args)
+            {
+                return collector(cbf(args...));
+            }
+        };
+
+        /// CollectorInvocation specialisation for signals with void return type.
+        template<class Collector, class... Args>
+        struct CollectorInvocation<Collector, void(Args...)> {
+            inline bool
+                invoke(Collector& collector, const std::function<void(Args...)>& cbf, Args... args)
+            {
+                cbf(args...); return collector();
+            }
+        };
+
+        /// ProtoSignal template specialised for the callback signature and collector.
+        template<class Collector, class R, class... Args>
+        class ProtoSignal<R(Args...), Collector> : private CollectorInvocation<Collector, R(Args...)> {
+        protected:
+            typedef std::function<R(Args...)> CbFunction;
+            typedef typename CbFunction::result_type Result;
+            typedef typename Collector::CollectorResult CollectorResult;
+        private:
+            /// SignalLink implements a doubly-linked ring with ref-counted nodes containing the signal handlers.
+            struct SignalLink {
+                SignalLink* next, * prev;
+                CbFunction  function;
+                int         ref_count;
+                explicit    SignalLink(const CbFunction& cbf) : next(NULL), prev(NULL), function(cbf), ref_count(1) {}
+                /*dtor*/   ~SignalLink() { assert(ref_count == 0); }
+                void        incref() { ref_count += 1; assert(ref_count > 0); }
+                void        decref() { ref_count -= 1; if (!ref_count) delete this; else assert(ref_count > 0); }
+                void
+                    unlink()
+                {
+                    function = NULL;
+                    if (next)
+                        next->prev = prev;
+                    if (prev)
+                        prev->next = next;
+                    decref();
+                    // leave intact ->next, ->prev for stale iterators
+                }
+                size_t
+                    add_before(const CbFunction& cb)
+                {
+                    SignalLink* link = new SignalLink(cb);
+                    link->prev = prev; // link to last
+                    link->next = this;
+                    prev->next = link; // link from last
+                    prev = link;
+                    static_assert (sizeof(link) == sizeof(size_t), "sizeof size_t");
+                    return size_t(link);
+                }
+                bool
+                    deactivate(const CbFunction& cbf)
+                {
+                    if (cbf == function)
+                    {
+                        function = NULL;      // deactivate static head
+                        return true;
+                    }
+                    for (SignalLink* link = this->next ? this->next : this; link != this; link = link->next)
+                        if (cbf == link->function)
+                        {
+                            link->unlink();     // deactivate and unlink sibling
+                            return true;
+                        }
+                    return false;
+                }
+                bool
+                    remove_sibling(size_t id)
+                {
+                    for (SignalLink* link = this->next ? this->next : this; link != this; link = link->next)
+                        if (id == size_t(link))
+                        {
+                            link->unlink();     // deactivate and unlink sibling
+                            return true;
+                        }
+                    return false;
+                }
+            };
+            SignalLink* callback_ring_; // linked ring of callback nodes
+            /*copy-ctor*/ ProtoSignal(const ProtoSignal&) = delete;
+            ProtoSignal& operator=   (const ProtoSignal&) = delete;
+            void
+                ensure_ring()
+            {
+                if (!callback_ring_)
+                {
+                    callback_ring_ = new SignalLink(CbFunction()); // ref_count = 1
+                    callback_ring_->incref(); // ref_count = 2, head of ring, can be deactivated but not removed
+                    callback_ring_->next = callback_ring_; // ring head initialization
+                    callback_ring_->prev = callback_ring_; // ring tail initialization
+                }
+            }
+        public:
+            /// ProtoSignal constructor, connects default callback if non-NULL.
+            ProtoSignal(const CbFunction& method) :
+                callback_ring_(NULL)
+            {
+                if (method != NULL)
+                {
+                    ensure_ring();
+                    callback_ring_->function = method;
+                }
+            }
+            /// ProtoSignal destructor releases all resources associated with this signal.
+            ~ProtoSignal()
+            {
+                if (callback_ring_)
+                {
+                    while (callback_ring_->next != callback_ring_)
+                        callback_ring_->next->unlink();
+                    assert(callback_ring_->ref_count >= 2);
+                    callback_ring_->decref();
+                    callback_ring_->decref();
+                }
+            }
+            /// Operator to add a new function or lambda as signal handler, returns a handler connection ID.
+            size_t operator+= (const CbFunction& cb) { ensure_ring(); return callback_ring_->add_before(cb); }
+            /// Operator to remove a signal handler through it connection ID, returns if a handler was removed.
+            bool   operator-= (size_t connection) { return callback_ring_ ? callback_ring_->remove_sibling(connection) : false; }
+            /// Emit a signal, i.e. invoke all its callbacks and collect return types with the Collector.
+            CollectorResult
+                emit(Args... args)
+            {
+                Collector collector;
+                if (!callback_ring_)
+                    return collector.result();
+                SignalLink* link = callback_ring_;
+                link->incref();
+                do
+                {
+                    if (link->function != NULL)
+                    {
+                        const bool continue_emission = this->invoke(collector, link->function, args...);
+                        if (!continue_emission)
+                            break;
+                    }
+                    SignalLink* old = link;
+                    link = old->next;
+                    link->incref();
+                    old->decref();
+                } while (link != callback_ring_);
+                link->decref();
+                return collector.result();
+            }
+        };
+
+    } // Lib
+    // namespace Simple
+
+    /**
+     * Signal is a template type providing an interface for arbitrary callback lists.
+     * A signal type needs to be declared with the function signature of its callbacks,
+     * and optionally a return result collector class type.
+     * Signal callbacks can be added with operator+= to a signal and removed with operator-=, using
+     * a callback connection ID return by operator+= as argument.
+     * The callbacks of a signal are invoked with the emit() method and arguments according to the signature.
+     * The result returned by emit() depends on the signal collector class. By default, the result of
+     * the last callback is returned from emit(). Collectors can be implemented to accumulate callback
+     * results or to halt a running emissions in correspondance to callback results.
+     * The signal implementation is safe against recursion, so callbacks may be removed and
+     * added during a signal emission and recursive emit() calls are also safe.
+     * The overhead of an unused signal is intentionally kept very low, around the size of a single pointer.
+     * Note that the Signal template types is non-copyable.
+     */
+    template <typename SignalSignature, class Collector = Lib::CollectorDefault<typename std::function<SignalSignature>::result_type> >
+    struct Signal /*final*/ :
+        Lib::ProtoSignal<SignalSignature, Collector>
+    {
+        typedef Lib::ProtoSignal<SignalSignature, Collector> ProtoSignal;
+        typedef typename ProtoSignal::CbFunction             CbFunction;
+        /// Signal constructor, supports a default callback as argument.
+        Signal(const CbFunction& method = CbFunction()) : ProtoSignal(method) {}
+    };
+
+    /// This function creates a std::function by binding @a object to the member function pointer @a method.
+    template<class Instance, class Class, class R, class... Args> std::function<R(Args...)>
+    slot(Instance& object, R(Class::* method) (Args...))
+    {
+        return [&object, method](Args... args) { return (object.*method) (args...); };
+    }
+
+    /// This function creates a std::function by binding @a object to the member function pointer @a method.
+    template<class Class, class R, class... Args> std::function<R(Args...)>
+    slot(Class* object, R(Class::* method) (Args...))
+    {
+        return [object, method](Args... args) { return (object->*method) (args...); };
+    }
+
+    /// Keep signal emissions going while all handlers return !0 (true).
+    template<typename Result>
+    struct CollectorUntil0 {
+        typedef Result CollectorResult;
+        explicit                      CollectorUntil0() : result_() {}
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_ = r;
+            return result_ ? true : false;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+    /// Keep signal emissions going while all handlers return 0 (false).
+    template<typename Result>
+    struct CollectorWhile0 {
+        typedef Result CollectorResult;
+        explicit                      CollectorWhile0() : result_() {}
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_ = r;
+            return result_ ? false : true;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+    /// CollectorVector returns the result of the all signal handlers from a signal emission in a std::vector.
+    template<typename Result>
+    struct CollectorVector {
+        typedef std::vector<Result> CollectorResult;
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_.push_back(r);
+            return true;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+} // Simple
+
+#endif // __SIMPLE_SIGNAL_HH__
+
+
+
+#ifndef DISABLE_TESTS
+
+#include <string>
+#include <stdarg.h>
+
+static std::string string_printf(const char* format, ...) __attribute__((__format__(__printf__, 1, 2)));
+static std::string
+string_printf(const char* format, ...)
+{
+    std::string result;
+    char* str = NULL;
+    va_list args;
+    va_start(args, format);
+    if (vasprintf(&str, format, args) >= 0)
+        result = str;
+    va_end(args);
+    if (str)
+        free(str);
+    return result;
+}
+
+static uint64_t
+timestamp_benchmark()
+{
+    struct timespec tp = { 0, 0 };
+    if (__builtin_expect(clock_gettime(CLOCK_MONOTONIC, &tp) < 0, 0))
+    {
+        perror("failed in clock_gettime");
+        exit(-1);
+    }
+    uint64_t stamp = tp.tv_sec * 1000000000ULL + tp.tv_nsec;
+    return stamp;
+}
+
+struct TestCounter {
+    static uint64_t get();
+    static void     set(uint64_t);
+    static void     add2(void*, uint64_t);
+};
+
+namespace { // Anon
+    void        (*test_counter_add2) (void*, uint64_t) = TestCounter::add2; // external symbol to prevent easy inlining
+    static uint64_t test_counter_var = 0;
+} // Anon
+
+class BasicSignalTests {
+    static std::string accu;
+    struct Foo {
+        char
+            foo_bool(float f, int i, std::string s)
+        {
+            accu += string_printf("Foo: %.2f\n", f + i + s.size());
+            return true;
+        }
+    };
+    static char
+        float_callback(float f, int, std::string)
+    {
+        accu += string_printf("float: %.2f\n", f);
+        return 0;
+    }
+public:
+    static void
+        run()
+    {
+        accu = "";
+        Simple::Signal<char(float, int, std::string)> sig1;
+        size_t id1 = sig1 += float_callback;
+        size_t id2 = sig1 += [](float, int i, std::string) { accu += string_printf("int: %d\n", i); return 0; };
+        size_t id3 = sig1 += [](float, int, const std::string& s) { accu += string_printf("string: %s\n", s.c_str()); return 0; };
+        sig1.emit(.3, 4, "huhu");
+        bool success;
+        success = sig1 -= id1; assert(success == true);  success = sig1 -= id1; assert(success == false);
+        success = sig1 -= id2; assert(success == true);  success = sig1 -= id3; assert(success == true);
+        success = sig1 -= id3; assert(success == false); success = sig1 -= id2; assert(success == false);
+        Foo foo;
+        sig1 += Simple::slot(foo, &Foo::foo_bool);
+        sig1 += Simple::slot(&foo, &Foo::foo_bool);
+        sig1.emit(.5, 1, "12");
+
+        Simple::Signal<void(std::string, int)> sig2;
+        sig2 += [](std::string msg, int) { accu += string_printf("msg: %s", msg.c_str()); };
+        sig2 += [](std::string, int d) { accu += string_printf(" *%d*\n", d); };
+        sig2.emit("in sig2", 17);
+
+        accu += "DONE";
+
+        const char* expected =
+            "float: 0.30\n"
+            "int: 4\n"
+            "string: huhu\n"
+            "Foo: 3.50\n"
+            "Foo: 3.50\n"
+            "msg: in sig2 *17*\n"
+            "DONE";
+        assert(accu == expected);
+    }
+};
+std::string BasicSignalTests::accu;
+
+
+class TestCollectorVector {
+    static int handler1() { return 1; }
+    static int handler42() { return 42; }
+    static int handler777() { return 777; }
+public:
+    static void
+        run()
+    {
+        Simple::Signal<int(), Simple::CollectorVector<int>> sig_vector;
+        sig_vector += handler777;
+        sig_vector += handler42;
+        sig_vector += handler1;
+        sig_vector += handler42;
+        sig_vector += handler777;
+        std::vector<int> results = sig_vector.emit();
+        const std::vector<int> reference = { 777, 42, 1, 42, 777, };
+        assert(results == reference);
+    }
+};
+
+class TestCollectorUntil0 {
+    bool check1, check2;
+    TestCollectorUntil0() : check1(0), check2(0) {}
+    bool handler_true() { check1 = true; return true; }
+    bool handler_false() { check2 = true; return false; }
+    bool handler_abort() { abort(); }
+public:
+    static void
+        run()
+    {
+        TestCollectorUntil0 self;
+        Simple::Signal<bool(), Simple::CollectorUntil0<bool>> sig_until0;
+        sig_until0 += Simple::slot(self, &TestCollectorUntil0::handler_true);
+        sig_until0 += Simple::slot(self, &TestCollectorUntil0::handler_false);
+        sig_until0 += Simple::slot(self, &TestCollectorUntil0::handler_abort);
+        assert(!self.check1 && !self.check2);
+        const bool result = sig_until0.emit();
+        assert(!result && self.check1 && self.check2);
+    }
+};
+
+class TestCollectorWhile0 {
+    bool check1, check2;
+    TestCollectorWhile0() : check1(0), check2(0) {}
+    bool handler_0() { check1 = true; return false; }
+    bool handler_1() { check2 = true; return true; }
+    bool handler_abort() { abort(); }
+public:
+    static void
+        run()
+    {
+        TestCollectorWhile0 self;
+        Simple::Signal<bool(), Simple::CollectorWhile0<bool>> sig_while0;
+        sig_while0 += Simple::slot(self, &TestCollectorWhile0::handler_0);
+        sig_while0 += Simple::slot(self, &TestCollectorWhile0::handler_1);
+        sig_while0 += Simple::slot(self, &TestCollectorWhile0::handler_abort);
+        assert(!self.check1 && !self.check2);
+        const bool result = sig_while0.emit();
+        assert(result == true && self.check1 && self.check2);
+    }
+};
+
+static void
+bench_simple_signal()
+{
+    Simple::Signal<void(void*, uint64_t)> sig_increment;
+    sig_increment += test_counter_add2;
+    const uint64_t start_counter = TestCounter::get();
+    const uint64_t benchstart = timestamp_benchmark();
+    uint64_t i;
+    for (i = 0; i < 999999; i++)
+    {
+        sig_increment.emit(NULL, 1);
+    }
+    const uint64_t benchdone = timestamp_benchmark();
+    const uint64_t end_counter = TestCounter::get();
+    assert(end_counter - start_counter == i);
+    printf("OK\n  Benchmark: Simple::Signal: %fns per emission (size=%zu): ", size_t(benchdone - benchstart) * 1.0 / size_t(i),
+        sizeof(sig_increment));
+}
+
+static void
+bench_callback_loop()
+{
+    void (*counter_increment) (void*, uint64_t) = test_counter_add2;
+    const uint64_t start_counter = TestCounter::get();
+    const uint64_t benchstart = timestamp_benchmark();
+    uint64_t i;
+    for (i = 0; i < 999999; i++)
+    {
+        counter_increment(NULL, 1);
+    }
+    const uint64_t benchdone = timestamp_benchmark();
+    const uint64_t end_counter = TestCounter::get();
+    assert(end_counter - start_counter == i);
+    printf("OK\n  Benchmark: callback loop: %fns per round: ", size_t(benchdone - benchstart) * 1.0 / size_t(i));
+}
+
+uint64_t
+TestCounter::get()
+{
+    return test_counter_var;
+}
+
+void
+TestCounter::set(uint64_t v)
+{
+    test_counter_var = v;
+}
+
+void
+TestCounter::add2(void*, uint64_t v)
+{
+    test_counter_var += v;
+}
+
+int
+main(int   argc,
+    char* argv[])
+{
+    printf("Signal/Basic Tests: ");
+    BasicSignalTests::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorVector: ");
+    TestCollectorVector::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorUntil0: ");
+    TestCollectorUntil0::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorWhile0: ");
+    TestCollectorWhile0::run();
+    printf("OK\n");
+
+    printf("Signal/Benchmark: Simple::Signal: ");
+    bench_simple_signal();
+    printf("OK\n");
+
+    printf("Signal/Benchmark: callback loop: ");
+    bench_callback_loop();
+    printf("OK\n");
+
+    return 0;
+}
+
+#endif // DISABLE_TESTS
+
+// g++ -Wall -O2 -std=gnu++0x -pthread simplesignal.cc -lrt && ./a.out

+ 135 - 0
Signals/Signals/Signals.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>{45d6f807-d85b-47e1-8d2f-8874004f6681}</ProjectGuid>
+    <RootNamespace>Signals</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="Signals.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 22 - 0
Signals/Signals/Signals.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="Quelldateien">
+      <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="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <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="Signals.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 4 - 0
Signals/Signals/Signals.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>

+ 98 - 0
Signals/Signals/x64/Debug/Signals.log

@@ -0,0 +1,98 @@
+Der Buildvorgang wurde am 26.04.2025 20:27:44 gestartet.
+Die Ausführlichkeit der Protokollierung ist auf "Normal" festgelegt.     1>Projekt "C:\Users\wruser\source\repos\Signals\Signals\Signals.vcxproj" auf Knoten "2", Build Ziel(e).
+     1>PrepareForBuild:
+         Die strukturierte Ausgabe ist aktiviert. Die Formatierung der Compilerdiagnose spiegelt die Fehlerhierarchie wider. Weitere Informationen finden Sie unter https://aka.ms/cpp/structured-output.
+       InitializeBuildStatus:
+         Aktualisieren des Timestamps von "x64\Debug\Signals.tlog\unsuccessfulbuild".
+       VcpkgTripletSelection:
+         Using triplet "x64-windows" from "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\"
+         Using normalized configuration "Debug"
+       ClCompile:
+         D:\Programme\VS2022\VC\Tools\MSVC\14.43.34808\bin\HostX64\x64\CL.exe /c /I"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\include" /ZI /JMC /nologo /W3 /WX- /diagnostics:column /sdl /Od /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /permissive- /Fo"x64\Debug\\" /Fd"x64\Debug\vc143.pdb" /external:W3 /Gd /TP /FC /errorReport:prompt Signals.cpp
+         Signals.cpp
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,59): error C3646: "__attribute__": Unbekannter Überschreibungsspezifizierer
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,72): error C2059: Syntaxfehler: "("
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,84): error C2143: Syntaxfehler: Es fehlt ")" vor "("
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,74): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,85): error C2065: "__printf__": nichtdeklarierter Bezeichner
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,84): error C2440: "Initialisierung": "initializer list" kann nicht in "int" konvertiert werden
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,84):
+             Der Initialisierer enthält zu viele Elemente.
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,102): error C2059: Syntaxfehler: ")"
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,103): error C2059: Syntaxfehler: ")"
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(313,1): error C2084: Funktion "std::string string_printf(const char *,...)" hat bereits einen Funktionsrumpf
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,20):
+             siehe vorherige Definition von "string_printf"
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(319,9): error C3861: "vasprintf": Bezeichner wurde nicht gefunden.
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(330,21): error C2079: "tp" verwendet undefiniertes struct "timestamp_benchmark::timespec"
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(330,26): error C2440: "Initialisierung": "initializer list" kann nicht in "int" konvertiert werden
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(330,26):
+             Der Initialisierer enthält zu viele Elemente.
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,40): error C2065: "CLOCK_MONOTONIC": nichtdeklarierter Bezeichner
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,26): error C3861: "clock_gettime": Bezeichner wurde nicht gefunden.
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,9): error C3861: "__builtin_expect": Bezeichner wurde nicht gefunden.
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(357,34): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(357,34):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(364,30): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(364,30):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(374,83): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(374,83):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(375,90): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(375,90):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(376,19): warning C4305: "Argument": Verkürzung von "double" in "float"
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(387,65): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(387,65):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(388,63): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+             C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(388,63):
+             kann "std::string string_printf(const char *,...)" sein
+         
+     1>Die Erstellung des Projekts "C:\Users\wruser\source\repos\Signals\Signals\Signals.vcxproj" ist abgeschlossen, Build Ziel(e) -- FEHLER.
+
+Fehler beim Buildvorgang.
+
+       "C:\Users\wruser\source\repos\Signals\Signals\Signals.vcxproj" (Build Ziel) (1) ->
+       (ClCompile Ziel) -> 
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(376,19): warning C4305: "Argument": Verkürzung von "double" in "float"
+
+
+       "C:\Users\wruser\source\repos\Signals\Signals\Signals.vcxproj" (Build Ziel) (1) ->
+       (ClCompile Ziel) -> 
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,59): error C3646: "__attribute__": Unbekannter Überschreibungsspezifizierer
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,72): error C2059: Syntaxfehler: "("
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,84): error C2143: Syntaxfehler: Es fehlt ")" vor "("
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,74): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,85): error C2065: "__printf__": nichtdeklarierter Bezeichner
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,84): error C2440: "Initialisierung": "initializer list" kann nicht in "int" konvertiert werden
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,102): error C2059: Syntaxfehler: ")"
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(311,103): error C2059: Syntaxfehler: ")"
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(313,1): error C2084: Funktion "std::string string_printf(const char *,...)" hat bereits einen Funktionsrumpf
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(319,9): error C3861: "vasprintf": Bezeichner wurde nicht gefunden.
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(330,21): error C2079: "tp" verwendet undefiniertes struct "timestamp_benchmark::timespec"
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(330,26): error C2440: "Initialisierung": "initializer list" kann nicht in "int" konvertiert werden
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,40): error C2065: "CLOCK_MONOTONIC": nichtdeklarierter Bezeichner
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,26): error C3861: "clock_gettime": Bezeichner wurde nicht gefunden.
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(331,9): error C3861: "__builtin_expect": Bezeichner wurde nicht gefunden.
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(357,34): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(364,30): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(374,83): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(375,90): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(387,65): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+         C:\Users\wruser\source\repos\Signals\Signals\Signals.cpp(388,63): error C2568: "+=": Auflösung der Funktionsüberladung nicht möglich
+
+    1 Warnung(en)
+    21 Fehler
+
+Verstrichene Zeit 00:00:00.86

+ 1 - 0
Signals/Signals/x64/Debug/Signals.tlog/CL.command.1.tlog

@@ -0,0 +1 @@
+��

+ 2 - 0
Signals/Signals/x64/Debug/Signals.tlog/Signals.lastbuildstate

@@ -0,0 +1,2 @@
+PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:VcpkgTriplet=x64-windows:
+Debug|x64|C:\Users\wruser\source\repos\Signals\|

+ 0 - 0
Signals/Signals/x64/Debug/Signals.tlog/unsuccessfulbuild


TEMPAT SAMPAH
Signals/Signals/x64/Debug/vc143.idb


TEMPAT SAMPAH
Signals/Signals/x64/Debug/vc143.pdb


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/CopilotIndices/17.13.444.19527/CodeChunks.db


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/CopilotIndices/17.13.444.19527/SemanticSymbols.db


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/FileContentIndex/4dd69da5-f412-4406-a8e4-74d0d8492422.vsidx


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/FileContentIndex/c64ee106-44e2-4bb7-b0ce-b12ac3ef39e4.vsidx


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/v17/.suo


TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/v17/Browse.VC.db


+ 62 - 0
SimpleSignal/.vs/SimpleSignal/v17/DocumentLayout.backup.json

@@ -0,0 +1,62 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|solutionrelative:SimpleSignal\\SimpleSignal.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|solutionrelative:SimpleSignal\\SimpleSignal.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 3,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "SimpleSignal.h",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h",
+              "RelativeDocumentMoniker": "SimpleSignal\\SimpleSignal.h",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h",
+              "RelativeToolTip": "SimpleSignal\\SimpleSignal.h",
+              "ViewState": "AgIAAMMAAAAAAAAAAAAUwOEAAAALAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-26T19:10:50.281Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "SimpleSignal.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp",
+              "RelativeDocumentMoniker": "SimpleSignal\\SimpleSignal.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp",
+              "RelativeToolTip": "SimpleSignal\\SimpleSignal.cpp",
+              "ViewState": "AgIAAN0AAAAAAAAAAAAUwPsAAAABAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-26T19:10:08.269Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 62 - 0
SimpleSignal/.vs/SimpleSignal/v17/DocumentLayout.json

@@ -0,0 +1,62 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\",
+  "Documents": [
+    {
+      "AbsoluteMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|solutionrelative:SimpleSignal\\SimpleSignal.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    },
+    {
+      "AbsoluteMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}",
+      "RelativeMoniker": "D:0:0:{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}|SimpleSignal\\SimpleSignal.vcxproj|solutionrelative:SimpleSignal\\SimpleSignal.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}"
+    }
+  ],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 200,
+          "SelectedChildIndex": 3,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}"
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 1,
+              "Title": "SimpleSignal.h",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h",
+              "RelativeDocumentMoniker": "SimpleSignal\\SimpleSignal.h",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.h",
+              "RelativeToolTip": "SimpleSignal\\SimpleSignal.h",
+              "ViewState": "AgIAAMMAAAAAAAAAAAAUwOEAAAALAAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|",
+              "WhenOpened": "2025-04-26T19:10:50.281Z",
+              "EditorCaption": ""
+            },
+            {
+              "$type": "Document",
+              "DocumentIndex": 0,
+              "Title": "SimpleSignal.cpp",
+              "DocumentMoniker": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp",
+              "RelativeDocumentMoniker": "SimpleSignal\\SimpleSignal.cpp",
+              "ToolTip": "C:\\Users\\wruser\\source\\repos\\SimpleSignal\\SimpleSignal\\SimpleSignal.cpp",
+              "RelativeToolTip": "SimpleSignal\\SimpleSignal.cpp",
+              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAA5AAAAAAAAAA==",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|",
+              "WhenOpened": "2025-04-26T19:10:08.269Z",
+              "EditorCaption": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

TEMPAT SAMPAH
SimpleSignal/.vs/SimpleSignal/v17/ipch/AutoPCH/a311fe2717716c83/SIMPLESIGNAL.ipch


+ 31 - 0
SimpleSignal/SimpleSignal.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}") = "SimpleSignal", "SimpleSignal\SimpleSignal.vcxproj", "{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}"
+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
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Debug|x64.ActiveCfg = Debug|x64
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Debug|x64.Build.0 = Debug|x64
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Debug|x86.ActiveCfg = Debug|Win32
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Debug|x86.Build.0 = Debug|Win32
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Release|x64.ActiveCfg = Release|x64
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Release|x64.Build.0 = Release|x64
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Release|x86.ActiveCfg = Release|Win32
+		{6B1579C5-BA33-46E3-9CE8-2AB084EF7489}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {FC581532-AF3A-4C04-9321-B558445D9746}
+	EndGlobalSection
+EndGlobal

+ 255 - 0
SimpleSignal/SimpleSignal/SimpleSignal.cpp

@@ -0,0 +1,255 @@
+#include "SimpleSignal.h"
+
+// g++ -Wall -O2 -std=gnu++11 -pthread test.cpp && ./a.out
+// append -fsanitize=address for memory debugging
+
+// https://raw.githubusercontent.com/larspensjo/SimpleSignal/refs/heads/master/SimpleSignal.h
+// https://github.com/larspensjo/SimpleSignal/tree/master
+
+#include <string>
+#include <stdarg.h>
+#include <time.h>
+#include <ctime>
+#include <cstdlib>
+#include <cassert>
+
+#ifndef _MSC_VER
+#include <sys/time.h>
+#include <stdio.h>
+static std::string string_printf(const char* format, ...) __attribute__((__format__(__printf__, 1, 2)));
+#endif
+
+static std::string
+string_printf(const char* format, ...)
+{
+    std::string result;
+    char str[1000];
+    va_list args;
+    va_start(args, format);
+    if (vsnprintf(str, sizeof str, format, args) >= 0)
+        result = str;
+    va_end(args);
+    return result;
+}
+
+static uint64_t
+timestamp_benchmark()
+{
+    auto now = std::clock();
+    return 1.0e9 / CLOCKS_PER_SEC * now;
+}
+
+struct TestCounter {
+    static uint64_t get();
+    static void     set(uint64_t);
+    static void     add2(void*, uint64_t);
+};
+
+namespace { // Anon
+    void        (*test_counter_add2) (void*, uint64_t) = TestCounter::add2; // external symbol to prevent easy inlining
+    static uint64_t test_counter_var = 0;
+} // Anon
+
+class BasicSignalTests {
+    static std::string accu;
+    struct Foo {
+        char
+            foo_bool(float f, int i, std::string s)
+        {
+            accu += string_printf("Foo: %.2f\n", f + i + s.size());
+            return true;
+        }
+    };
+    static char
+        float_callback(float f, int, std::string)
+    {
+        accu += string_printf("float: %.2f\n", f);
+        return 0;
+    }
+public:
+    static void
+        run()
+    {
+        accu = "";
+        Simple::Signal<char(float, int, std::string)> sig1;
+        size_t id1 = sig1.connect(float_callback);
+        size_t id2 = sig1.connect([](float, int i, std::string) { accu += string_printf("int: %d\n", i); return 0; });
+        size_t id3 = sig1.connect([](float, int, const std::string& s) { accu += string_printf("string: %s\n", s.c_str()); return 0; });
+        sig1.emit(.3, 4, "huhu");
+        bool success;
+        success = sig1.disconnect(id1); assert(success == true);  success = sig1.disconnect(id1); assert(success == false);
+        success = sig1.disconnect(id2); assert(success == true);  success = sig1.disconnect(id3); assert(success == true);
+        success = sig1.disconnect(id3); assert(success == false); success = sig1.disconnect(id2); assert(success == false);
+        Foo foo;
+        sig1.connect(Simple::slot(foo, &Foo::foo_bool));
+        sig1.connect(Simple::slot(&foo, &Foo::foo_bool));
+        sig1.emit(.5, 1, "12");
+
+        Simple::Signal<void(std::string, int)> sig2;
+        sig2.connect([](std::string msg, int) { accu += string_printf("msg: %s", msg.c_str()); });
+        sig2.connect([](std::string, int d) { accu += string_printf(" *%d*\n", d); });
+        sig2.emit("in sig2", 17);
+
+        accu += "DONE";
+
+        const char* expected =
+            "float: 0.30\n"
+            "int: 4\n"
+            "string: huhu\n"
+            "Foo: 3.50\n"
+            "Foo: 3.50\n"
+            "msg: in sig2 *17*\n"
+            "DONE";
+        assert(accu == expected);
+    }
+};
+std::string BasicSignalTests::accu;
+
+
+class TestCollectorVector {
+    static int handler1() { return 1; }
+    static int handler42() { return 42; }
+    static int handler777() { return 777; }
+public:
+    static void
+        run()
+    {
+        Simple::Signal<int(), Simple::CollectorVector<int>> sig_vector;
+        sig_vector.connect(handler777);
+        sig_vector.connect(handler42);
+        sig_vector.connect(handler1);
+        sig_vector.connect(handler42);
+        sig_vector.connect(handler777);
+        std::vector<int> results = sig_vector.emit();
+        const std::vector<int> reference = { 777, 42, 1, 42, 777, };
+        assert(5 == sig_vector.size());
+        assert(results == reference);
+    }
+};
+
+class TestCollectorUntil0 {
+    bool check1, check2;
+    TestCollectorUntil0() : check1(0), check2(0) {}
+    bool handler_true() { check1 = true; return true; }
+    bool handler_false() { check2 = true; return false; }
+    bool handler_abort() { std::abort(); }
+public:
+    static void
+        run()
+    {
+        TestCollectorUntil0 self;
+        Simple::Signal<bool(), Simple::CollectorUntil0<bool>> sig_until0;
+        sig_until0.connect(Simple::slot(self, &TestCollectorUntil0::handler_true));
+        sig_until0.connect(Simple::slot(self, &TestCollectorUntil0::handler_false));
+        sig_until0.connect(Simple::slot(self, &TestCollectorUntil0::handler_abort));
+        assert(!self.check1 && !self.check2);
+        const bool result = sig_until0.emit();
+        assert(!result && self.check1 && self.check2);
+    }
+};
+
+class TestCollectorWhile0 {
+    bool check1, check2;
+    TestCollectorWhile0() : check1(0), check2(0) {}
+    bool handler_0() { check1 = true; return false; }
+    bool handler_1() { check2 = true; return true; }
+    bool handler_abort() { std::abort(); }
+public:
+    static void
+        run()
+    {
+        TestCollectorWhile0 self;
+        Simple::Signal<bool(), Simple::CollectorWhile0<bool>> sig_while0;
+        sig_while0.connect(Simple::slot(self, &TestCollectorWhile0::handler_0));
+        sig_while0.connect(Simple::slot(self, &TestCollectorWhile0::handler_1));
+        sig_while0.connect(Simple::slot(self, &TestCollectorWhile0::handler_abort));
+        assert(!self.check1 && !self.check2);
+        const bool result = sig_while0.emit();
+        assert(result == true && self.check1 && self.check2);
+    }
+};
+
+static void
+bench_simple_signal()
+{
+    Simple::Signal<void(void*, uint64_t)> sig_increment;
+    sig_increment.connect(test_counter_add2);
+    const uint64_t start_counter = TestCounter::get();
+    const uint64_t benchstart = timestamp_benchmark();
+    uint64_t i;
+    for (i = 0; i < 999999; i++)
+    {
+        sig_increment.emit(nullptr, 1);
+    }
+    const uint64_t benchdone = timestamp_benchmark();
+    const uint64_t end_counter = TestCounter::get();
+    assert(end_counter - start_counter == i);
+    printf("OK\n  Benchmark: Simple::Signal: %fns per emission (size=%u): ", size_t(benchdone - benchstart) * 1.0 / size_t(i),
+        (unsigned int)sizeof(sig_increment));
+}
+
+static void
+bench_callback_loop()
+{
+    void (*counter_increment) (void*, uint64_t) = test_counter_add2;
+    const uint64_t start_counter = TestCounter::get();
+    const uint64_t benchstart = timestamp_benchmark();
+    uint64_t i;
+    for (i = 0; i < 999999; i++)
+    {
+        counter_increment(nullptr, 1);
+    }
+    const uint64_t benchdone = timestamp_benchmark();
+    const uint64_t end_counter = TestCounter::get();
+    assert(end_counter - start_counter == i);
+    printf("OK\n  Benchmark: callback loop: %fns per round: ", size_t(benchdone - benchstart) * 1.0 / size_t(i));
+}
+
+uint64_t
+TestCounter::get()
+{
+    return test_counter_var;
+}
+
+void
+TestCounter::set(uint64_t v)
+{
+    test_counter_var = v;
+}
+
+void
+TestCounter::add2(void*, uint64_t v)
+{
+    test_counter_var += v;
+}
+
+int
+main(int   argc,
+    char* argv[])
+{
+    printf("Signal/Basic Tests: ");
+    BasicSignalTests::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorVector: ");
+    TestCollectorVector::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorUntil0: ");
+    TestCollectorUntil0::run();
+    printf("OK\n");
+
+    printf("Signal/CollectorWhile0: ");
+    TestCollectorWhile0::run();
+    printf("OK\n");
+
+    printf("Signal/Benchmark: Simple::Signal: ");
+    bench_simple_signal();
+    printf("OK\n");
+
+    printf("Signal/Benchmark: callback loop: ");
+    bench_callback_loop();
+    printf("OK\n");
+
+    return 0;
+}

+ 226 - 0
SimpleSignal/SimpleSignal/SimpleSignal.h

@@ -0,0 +1,226 @@
+#pragma once
+
+// CC0 Public Domain: http://creativecommons.org/publicdomain/zero/1.0/
+#pragma once
+
+#include <memory>
+#include <functional>
+#include <list>
+#include <vector>
+#include <algorithm>
+
+namespace Simple {
+
+    namespace Lib {
+
+        /// ProtoSignal is the template implementation for callback list.
+        template<typename, typename> class ProtoSignal;   // undefined
+
+        /// CollectorInvocation invokes signal handlers differently depending on return type.
+        template<typename, typename> struct CollectorInvocation;
+
+        /// CollectorLast returns the result of the last signal handler from a signal emission.
+        template<typename Result>
+        struct CollectorLast {
+            using CollectorResult = Result;
+            explicit        CollectorLast() : last_() {}
+            inline bool     operator()    (Result r) { last_ = r; return true; }
+            CollectorResult result() { return last_; }
+        private:
+            Result last_;
+        };
+
+        /// CollectorDefault implements the default signal handler collection behaviour.
+        template<typename Result>
+        struct CollectorDefault : CollectorLast<Result>
+        {
+        };
+
+        /// CollectorDefault specialisation for signals with void return type.
+        template<>
+        struct CollectorDefault<void> {
+            using CollectorResult = void;
+            void                  result() {}
+            inline bool           operator() (void) { return true; }
+        };
+
+        /// CollectorInvocation specialisation for regular signals.
+        template<class Collector, class R, class... Args>
+        struct CollectorInvocation<Collector, R(Args...)> {
+            inline bool
+                invoke(Collector& collector, const std::function<R(Args...)>& cbf, Args... args) const
+            {
+                return collector(cbf(args...));
+            }
+        };
+
+        /// CollectorInvocation specialisation for signals with void return type.
+        template<class Collector, class... Args>
+        struct CollectorInvocation<Collector, void(Args...)> {
+            inline bool
+                invoke(Collector& collector, const std::function<void(Args...)>& cbf, Args... args) const
+            {
+                cbf(args...); return collector();
+            }
+        };
+
+        /// ProtoSignal template specialised for the callback signature and collector.
+        template<class Collector, class R, class... Args>
+        class ProtoSignal<R(Args...), Collector> : private CollectorInvocation<Collector, R(Args...)> {
+        protected:
+            using CbFunction = std::function<R(Args...)>;
+            using Result = typename CbFunction::result_type;
+            using CollectorResult = typename Collector::CollectorResult;
+
+        private:
+            /*copy-ctor*/ ProtoSignal(const ProtoSignal&) = delete;
+            ProtoSignal& operator=   (const ProtoSignal&) = delete;
+
+            using CallbackSlot = std::shared_ptr<CbFunction>;
+            using CallbackList = std::list<CallbackSlot>;
+            CallbackList callback_list_;
+
+            size_t add_cb(const CbFunction& cb)
+            {
+                callback_list_.emplace_back(std::make_shared<CbFunction>(cb));
+                return size_t(callback_list_.back().get());
+            }
+
+            bool remove_cb(size_t id)
+            {
+                auto it = std::remove_if(begin(callback_list_), end(callback_list_),
+                    [id](const CallbackSlot& slot) { return size_t(slot.get()) == id; });
+                bool const removed = it != end(callback_list_);
+                callback_list_.erase(it, end(callback_list_));
+                return removed;
+            }
+
+        public:
+            /// ProtoSignal constructor, connects default callback if non-nullptr.
+            ProtoSignal(const CbFunction& method)
+            {
+                if (method)
+                    add_cb(method);
+            }
+            /// ProtoSignal destructor releases all resources associated with this signal.
+            ~ProtoSignal()
+            {
+            }
+
+            /// Operator to add a new function or lambda as signal handler, returns a handler connection ID.
+            size_t connect(const CbFunction& cb) { return add_cb(cb); }
+            /// Operator to remove a signal handler through it connection ID, returns if a handler was removed.
+            bool   disconnect(size_t connection) { return remove_cb(connection); }
+
+            /// Emit a signal, i.e. invoke all its callbacks and collect return types with the Collector.
+            CollectorResult
+                emit(Args... args) const
+            {
+                Collector collector;
+                for (auto& slot : callback_list_) {
+                    if (slot) {
+                        const bool continue_emission = this->invoke(collector, *slot, args...);
+                        if (!continue_emission)
+                            break;
+                    }
+                }
+                return collector.result();
+            }
+            // Number of connected slots.
+            std::size_t
+                size() const
+            {
+                return callback_list_.size();
+            }
+        };
+
+    } // Lib
+    // namespace Simple
+
+    /**
+     * Signal is a template type providing an interface for arbitrary callback lists.
+     * A signal type needs to be declared with the function signature of its callbacks,
+     * and optionally a return result collector class type.
+     * Signal callbacks can be added with operator+= to a signal and removed with operator-=, using
+     * a callback connection ID return by operator+= as argument.
+     * The callbacks of a signal are invoked with the emit() method and arguments according to the signature.
+     * The result returned by emit() depends on the signal collector class. By default, the result of
+     * the last callback is returned from emit(). Collectors can be implemented to accumulate callback
+     * results or to halt a running emissions in correspondance to callback results.
+     * The signal implementation is safe against recursion, so callbacks may be removed and
+     * added during a signal emission and recursive emit() calls are also safe.
+     * The overhead of an unused signal is intentionally kept very low, around the size of a single pointer.
+     * Note that the Signal template types is non-copyable.
+     */
+    template <typename SignalSignature, class Collector = Lib::CollectorDefault<typename std::function<SignalSignature>::result_type> >
+    struct Signal /*final*/ :
+        Lib::ProtoSignal<SignalSignature, Collector>
+    {
+        using ProtoSignal = Lib::ProtoSignal<SignalSignature, Collector>;
+        using CbFunction = typename ProtoSignal::CbFunction;
+        /// Signal constructor, supports a default callback as argument.
+        Signal(const CbFunction& method = CbFunction()) : ProtoSignal(method) {}
+    };
+
+    /// This function creates a std::function by binding @a object to the member function pointer @a method.
+    template<class Instance, class Class, class R, class... Args> std::function<R(Args...)>
+    slot(Instance& object, R(Class::* method) (Args...))
+    {
+        return [&object, method](Args... args) { return (object.*method) (args...); };
+    }
+
+    /// This function creates a std::function by binding @a object to the member function pointer @a method.
+    template<class Class, class R, class... Args> std::function<R(Args...)>
+    slot(Class* object, R(Class::* method) (Args...))
+    {
+        return [object, method](Args... args) { return (object->*method) (args...); };
+    }
+
+    /// Keep signal emissions going while all handlers return !0 (true).
+    template<typename Result>
+    struct CollectorUntil0 {
+        using CollectorResult = Result;
+        explicit                      CollectorUntil0() : result_() {}
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_ = r;
+            return result_ ? true : false;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+    /// Keep signal emissions going while all handlers return 0 (false).
+    template<typename Result>
+    struct CollectorWhile0 {
+        using CollectorResult = Result;
+        explicit                      CollectorWhile0() : result_() {}
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_ = r;
+            return result_ ? false : true;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+    /// CollectorVector returns the result of the all signal handlers from a signal emission in a std::vector.
+    template<typename Result>
+    struct CollectorVector {
+        using CollectorResult = std::vector<Result>;
+        const CollectorResult& result() { return result_; }
+        inline bool
+            operator() (Result r)
+        {
+            result_.push_back(r);
+            return true;
+        }
+    private:
+        CollectorResult result_;
+    };
+
+} // Simple

+ 138 - 0
SimpleSignal/SimpleSignal/SimpleSignal.vcxproj

@@ -0,0 +1,138 @@
+<?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>{6b1579c5-ba33-46e3-9ce8-2ab084ef7489}</ProjectGuid>
+    <RootNamespace>SimpleSignal</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="SimpleSignal.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="SimpleSignal.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 27 - 0
SimpleSignal/SimpleSignal/SimpleSignal.vcxproj.filters

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <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="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <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="SimpleSignal.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="SimpleSignal.h">
+      <Filter>Quelldateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 4 - 0
SimpleSignal/SimpleSignal/SimpleSignal.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>

+ 11 - 0
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.exe.recipe

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

TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.ilk


+ 42 - 0
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.log

@@ -0,0 +1,42 @@
+Der Buildvorgang wurde am 26.04.2025 21:11:07 gestartet.
+Die Ausführlichkeit der Protokollierung ist auf "Normal" festgelegt.     1>Projekt "C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.vcxproj" auf Knoten "2", Build Ziel(e).
+     1>PrepareForBuild:
+         Die strukturierte Ausgabe ist aktiviert. Die Formatierung der Compilerdiagnose spiegelt die Fehlerhierarchie wider. Weitere Informationen finden Sie unter https://aka.ms/cpp/structured-output.
+         Das Verzeichnis "C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\" wird erstellt.
+         Das Verzeichnis "x64\Debug\SimpleSignal.tlog\" wird erstellt.
+       InitializeBuildStatus:
+         "x64\Debug\SimpleSignal.tlog\unsuccessfulbuild" wird erstellt, da "AlwaysCreate" angegeben wurde.
+         Aktualisieren des Timestamps von "x64\Debug\SimpleSignal.tlog\unsuccessfulbuild".
+       VcpkgTripletSelection:
+         Using triplet "x64-windows" from "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\"
+         Using normalized configuration "Debug"
+       ClCompile:
+         D:\Programme\VS2022\VC\Tools\MSVC\14.43.34808\bin\HostX64\x64\CL.exe /c /I"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\include" /ZI /JMC /nologo /W3 /WX- /diagnostics:column /sdl /Od /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /permissive- /Fo"x64\Debug\\" /Fd"x64\Debug\vc143.pdb" /external:W3 /Gd /TP /FC /errorReport:prompt SimpleSignal.cpp
+         SimpleSignal.cpp
+     1>C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.cpp(36,35): warning C4244: "return": Konvertierung von "double" in "uint64_t", möglicher Datenverlust
+     1>C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.cpp(75,19): warning C4305: "Argument": Verkürzung von "double" in "float"
+       Link:
+         D:\Programme\VS2022\VC\Tools\MSVC\14.43.34808\bin\HostX64\x64\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.exe" /INCREMENTAL /ILK:"x64\Debug\SimpleSignal.ilk" /NOLOGO /LIBPATH:"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib" /LIBPATH:"C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib\manual-link" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\lib\*.lib" /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.lib" /MACHINE:X64 x64\Debug\SimpleSignal.obj
+         SimpleSignal.vcxproj -> C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.exe
+       AppLocalFromInstalled:
+         pwsh.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\SimpleSignal.tlog\SimpleSignal.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
+         Der Befehl "pwsh.exe" ist entweder falsch geschrieben oder
+         konnte nicht gefunden werden.
+         Der Befehl "pwsh.exe -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\SimpleSignal.tlog\SimpleSignal.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"" wurde mit dem Code 9009 beendet.
+         "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -noprofile -File "C:\Users\wruser\source\repos\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Users\wruser\source\repos\SimpleSignal\x64\Debug\SimpleSignal.exe" "C:\Users\wruser\source\repos\vcpkg\installed\x64-windows\debug\bin" "x64\Debug\SimpleSignal.tlog\SimpleSignal.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
+       FinalizeBuildStatus:
+         Die Datei "x64\Debug\SimpleSignal.tlog\unsuccessfulbuild" wird gelöscht.
+         Aktualisieren des Timestamps von "x64\Debug\SimpleSignal.tlog\SimpleSignal.lastbuildstate".
+     1>Die Erstellung von Projekt "C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.vcxproj" ist abgeschlossen (Build Ziel(e)).
+
+Der Buildvorgang wurde erfolgreich ausgeführt.
+
+       "C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.vcxproj" (Build Ziel) (1) ->
+       (ClCompile Ziel) -> 
+         C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.cpp(36,35): warning C4244: "return": Konvertierung von "double" in "uint64_t", möglicher Datenverlust
+         C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.cpp(75,19): warning C4305: "Argument": Verkürzung von "double" in "float"
+
+    2 Warnung(en)
+    0 Fehler
+
+Verstrichene Zeit 00:00:02.31

TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.obj


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.command.1.tlog


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.read.1.tlog


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/CL.write.1.tlog


+ 1 - 0
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/Cl.items.tlog

@@ -0,0 +1 @@
+C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\SimpleSignal.cpp;C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\x64\Debug\SimpleSignal.obj

+ 2 - 0
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/SimpleSignal.lastbuildstate

@@ -0,0 +1,2 @@
+PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:VcpkgTriplet=x64-windows:
+Debug|x64|C:\Users\wruser\source\repos\SimpleSignal\|

TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.command.1.tlog


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.read.1.tlog


+ 2 - 0
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.secondary.1.tlog

@@ -0,0 +1,2 @@
+^C:\USERS\WRUSER\SOURCE\REPOS\SIMPLESIGNAL\SIMPLESIGNAL\X64\DEBUG\SIMPLESIGNAL.OBJ
+C:\Users\wruser\source\repos\SimpleSignal\SimpleSignal\x64\Debug\SimpleSignal.ilk

TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/SimpleSignal.tlog/link.write.1.tlog


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/vc143.idb


TEMPAT SAMPAH
SimpleSignal/SimpleSignal/x64/Debug/vc143.pdb


+ 1 - 0
SimpleSignal/SimpleSignal/x64/Debug/vcpkg.applocal.log

@@ -0,0 +1 @@
+

TEMPAT SAMPAH
SimpleSignal/x64/Debug/SimpleSignal.exe


TEMPAT SAMPAH
SimpleSignal/x64/Debug/SimpleSignal.pdb


TEMPAT SAMPAH
Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/CopilotIndices/17.13.444.19527/CodeChunks.db


TEMPAT SAMPAH
Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/CopilotIndices/17.13.444.19527/SemanticSymbols.db


TEMPAT SAMPAH
Strategy Design Pattern in Modern C++/.vs/Strategy Design Pattern in Modern C++/FileContentIndex/b0e40f97-811d-47e2-81ae-8b13a549321f.vsidx


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini