@@ -1,15 +1,66 @@ | |||||
#include <list> | |||||
#include <string> | #include <string> | ||||
#include <vector> | |||||
#ifndef ctx_HEADER | #ifndef ctx_HEADER | ||||
#define ctx_HEADER | #define ctx_HEADER | ||||
template <class T> class ctx_Controller { | template <class T> class ctx_Controller { | ||||
T context; | T context; | ||||
std::list<void *(T)> callbacks; | |||||
std::list<T *(T)> functions; | |||||
bool isProcessingQueue = false; | |||||
std::list<T> queue; | |||||
ctx_Controller(const T &c) { | ctx_Controller(const T &c) { | ||||
context = c; | context = c; | ||||
} | } | ||||
void executeFunctions() { | |||||
T c = queue.front(); | |||||
queue.pop_front(); | |||||
for (int i = 0; i < functions.size(); ++i) { | |||||
T ctx = functions[i](c); | |||||
if (ctx.recentField != "none") { | |||||
queue.push_back(ctx); | |||||
} | |||||
} | |||||
context = c; | |||||
reportContext(); | |||||
} | |||||
void processQueue() { | |||||
// Decline recursion. | |||||
if (isProcessingQueue) { | |||||
return; | |||||
} | |||||
isProcessingQueue = true; | |||||
while (!queue.empty()) { | |||||
executeFunctions(); | |||||
} | |||||
isProcessingQueue = false; | |||||
} | |||||
void registerCallback(void (*cb)(T)) { | |||||
callbacks.push_back(cb); | |||||
} | |||||
void registerFunction(T (*f)(T)) { | |||||
functions.push_back(f); | |||||
} | |||||
void reportContext() { | |||||
for (int i = 0; i < callbacks.size(); ++i) { | |||||
callbacks[i](context); | |||||
} | |||||
} | |||||
template <typename U> void set(const std::string &fieldName, const U &value) { | |||||
T c = context; | |||||
c.setField(fieldName, value); | |||||
c.recentField = fieldName; | |||||
queue.push_back(c); | |||||
processQueue(); | |||||
} | |||||
}; | }; | ||||
#endif // ctx_HEADER | #endif // ctx_HEADER |
@@ -14,7 +14,9 @@ class ctx_Controller: | |||||
ctx = f(c) | ctx = f(c) | ||||
if ctx.recentField != "none": | if ctx.recentField != "none": | ||||
self.queue.append(ctx) | self.queue.append(ctx) | ||||
self.context = c | |||||
self.context.recentField = c.recentField | |||||
self.context.setField(c.recentField, c.field(c.recentField)) | |||||
self.reportContext() | self.reportContext() | ||||
def processQueue(self): | def processQueue(self): | ||||
@@ -0,0 +1,79 @@ | |||||
from ctx import * | |||||
from memory import * | |||||
from memory_Context import * | |||||
def ctx_test_Controller_executeFunctions_set( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
ctrl = ctx_Controller(c) | |||||
# Disable automatic invocation of executeFunctions. | |||||
ctrl.isProcessingQueue = True | |||||
ctrl.set("input", "123") | |||||
ctrl.registerFunction(__processInput) | |||||
# Apply 'input'. | |||||
ctrl.executeFunctions() | |||||
# Apply 'outputHelp'. | |||||
ctrl.executeFunctions() | |||||
if ( | |||||
c.input == "123" and | |||||
c.outputHelp == "Checked" | |||||
): | |||||
return "OK: ctx_Controller_executeFunctions_set" | |||||
#} | |||||
return "ERR: ctx_Controller_executeFunctions_set" | |||||
#} | |||||
def ctx_test_Controller_processQueue( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
ctrl = ctx_Controller(c) | |||||
ctrl.registerFunction(__processInput) | |||||
ctrl.set("input", "abc"); | |||||
if ( | |||||
c.input == "abc" and | |||||
c.outputHelp == "Checked" | |||||
): | |||||
return "OK: ctx_Controller_processQueue" | |||||
#} | |||||
return "ERR: ctx_Controller_processQueue" | |||||
#} | |||||
def ctx_test_memoryContext_field( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
c.input = "abc" | |||||
if ( | |||||
c.field("input") == "abc" | |||||
): | |||||
return "OK: ctx_memoryContext_field" | |||||
#} | |||||
return "ERR: ctx_memoryContext_field" | |||||
#} | |||||
def ctx_test_memoryContext_setField( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
c.input = "abc" | |||||
c.setField("input", "123") | |||||
if ( | |||||
c.field("input") == "123" | |||||
): | |||||
return "OK: ctx_memoryContext_setField" | |||||
#} | |||||
return "ERR: ctx_memoryContext_setField" | |||||
#} | |||||
# Auxiliary functions. | |||||
@llm_by_value | |||||
def __processInput(c): | |||||
if ( | |||||
c.recentField == "input" | |||||
): | |||||
c.outputHelp = "Checked" | |||||
c.recentField = "outputHelp" | |||||
return c | |||||
#} | |||||
c.recentField = "none" | |||||
return c | |||||
#} |
@@ -0,0 +1,53 @@ | |||||
from ctx import * | |||||
from memory import * | |||||
from memory_Context import * | |||||
def ctx_test_Python_Controller_registerFieldCallback_match( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
ctrl = ctx_Controller(c) | |||||
c.input = "123" | |||||
c.recentField = "input" | |||||
globals()["__callbackInput"] = "" | |||||
ctrl.registerFieldCallback("input", __setCallbackInput) | |||||
ctrl.reportContext() | |||||
val = globals()["__callbackInput"] | |||||
if ( | |||||
c.input == globals()["__callbackInput"] | |||||
): | |||||
return "OK: ctx_Python_Controller_registerFieldCallback_match" | |||||
#} | |||||
return f"ERR: ctx_Python_Controller_registerFieldCallback_match" | |||||
#} | |||||
def ctx_test_Python_Controller_registerFieldCallback_mismatch( | |||||
) -> str: | |||||
c = memory_createContext() | |||||
ctrl = ctx_Controller(c) | |||||
c.input = "123" | |||||
c.outputHelp = "you" | |||||
c.recentField = "outputHelp" | |||||
globals()["__callbackInput"] = "" | |||||
ctrl.registerFieldCallback("input", __setCallbackInput) | |||||
ctrl.reportContext() | |||||
val = globals()["__callbackInput"] | |||||
if ( | |||||
globals()["__callbackInput"] == "" | |||||
): | |||||
return "OK: ctx_Python_Controller_registerFieldCallback_mismatch" | |||||
#} | |||||
return f"ERR: ctx_Python_Controller_registerFieldCallback_mismatch" | |||||
#} | |||||
# Auxiliary. | |||||
__callbackInput = "" | |||||
@llm_by_value | |||||
def __setCallbackInput(c): | |||||
if ( | |||||
c.recentField == "input" | |||||
): | |||||
globals()["__callbackInput"] = c.input | |||||
#} | |||||
#} |
@@ -1,11 +1,20 @@ | |||||
from cli import * | from cli import * | ||||
from cli_test import * | from cli_test import * | ||||
from ctx import * | from ctx import * | ||||
from ctx_test import * | |||||
from ctx_test_Python import * | |||||
from llm_test import * | from llm_test import * | ||||
from llm_test_Python import * | from llm_test_Python import * | ||||
from memory_test import * | from memory_test import * | ||||
import sys | import sys | ||||
print(ctx_test_Controller_executeFunctions_set()) | |||||
print(ctx_test_Controller_processQueue()) | |||||
print(ctx_test_Python_Controller_registerFieldCallback_match()) | |||||
print(ctx_test_Python_Controller_registerFieldCallback_mismatch()) | |||||
print(ctx_test_memoryContext_field()) | |||||
print(ctx_test_memoryContext_setField()) | |||||
print(llm_test_Python_copyByValue()) | print(llm_test_Python_copyByValue()) | ||||
print(llm_test_isDigit_digit()) | print(llm_test_isDigit_digit()) | ||||
print(llm_test_isDigit_notDigit()) | print(llm_test_isDigit_notDigit()) | ||||