Difference between revisions of "NodeSpace.h"

From Organic Design wiki
m
(nodeInsert())
Line 5: Line 5:
 
// Reserved nodes (tmp)
 
// Reserved nodes (tmp)
 
#define nodeROOT 0
 
#define nodeROOT 0
 +
#define nodeNULL 0
 
#define nodeFALSE 0
 
#define nodeFALSE 0
 
#define nodeLOOP 1
 
#define nodeLOOP 1
Line 50: Line 51:
 
// todo: onChange
 
// todo: onChange
 
return listSetValue(key?listTraverse((item)subject,(item)key):(item)subject, (item)value);
 
return listSetValue(key?listTraverse((item)subject,(item)key):(item)subject, (item)value);
 +
}
 +
 +
// Returns a newly created node
 +
node nodeInsert() {
 +
return (node)listInsert();
 
}
 
}
  
 
// Returns newly created node
 
// Returns newly created node
// - thsi is just traverse() but with an event raised
+
// - this is just traverse() but with an event raised
 
node nodeInsertKey(node subject,node key) {
 
node nodeInsertKey(node subject,node key) {
 
// todo: onInstall
 
// todo: onInstall
Line 69: Line 75:
  
 
// Returns the inserted node as the new loop pointer
 
// Returns the inserted node as the new loop pointer
// (this allows it to act as a stack if nodeLOOP (current-loop-node) is updated with returned node)
+
// - this allows it to act as a stack if nodeLOOP (current-loop-node) is updated with returned node
 +
// - either can be nodeNULL on entry (for new loop and/or new node)
 
node nodeLoopInsert(node subject,node insert) {
 
node nodeLoopInsert(node subject,node insert) {
 +
if (insert == nodeNULL) subject = insert;
 +
if (subject == nodeNULL) subject = insert;
 
node next = nodeGetValue(subject,nodeNEXT);
 
node next = nodeGetValue(subject,nodeNEXT);
 
nodeSetValue(insert,nodeNEXT,next);
 
nodeSetValue(insert,nodeNEXT,next);
Line 103: Line 112:
 
int nodeReduce(node subject) {
 
int nodeReduce(node subject) {
 
node loop = nodeGetValue(subject,nodeLOOP);
 
node loop = nodeGetValue(subject,nodeLOOP);
if (loop == nodeFALSE) return 0; // return if no current-loop-pointer
+
if (loop == nodeNULL) return 0; // return if no current-loop-pointer
 
nodeSetValue(subject, nodeLOOP, nodeGetValue(loop, nodeNEXT)); // test NEXT first?
 
nodeSetValue(subject, nodeLOOP, nodeGetValue(loop, nodeNEXT)); // test NEXT first?
 
if (nodeGetValue(loop, nodeCODE) == nodeTRUE) {
 
if (nodeGetValue(loop, nodeCODE) == nodeTRUE) {
((code)nodeGetState(loop,nodeFALSE))(); // execute code-ref returned in state
+
((code)nodeGetState(loop,nodeNULL))(); // execute code-ref returned in state
 
// Later this must declare and build if no function-reference
 
// Later this must declare and build if no function-reference
 
// replace self in loop with n.THEN if non-zero
 
// replace self in loop with n.THEN if non-zero

Revision as of 04:49, 30 July 2006

// This article and all its includes are licenced under LGPL // GPL: http://www.gnu.org/copyleft/lesser.html // SRC: http://www.organicdesign.co.nz/nodeSpace.c

// Reserved nodes (tmp)

  1. define nodeROOT 0
  2. define nodeNULL 0
  3. define nodeFALSE 0
  4. define nodeLOOP 1
  5. define nodeTRUE 1
  6. define nodeNEXT 2
  7. define nodePREV 3
  8. define nodeTHEN 4
  9. define nodeCODE 5

// these will have content, so must start after 128 ascii-list-items

  1. define nodeNETWORK 128
  2. define nodeDESKTOP 129
  3. define nodeSTREAMINFO 130

typedef int node; // node: a type for referring to nodes typedef void (*code)(); // code: a type for referring to functions node this; // this: the current node, like cwd


// Prototypes node nodeTraverse(node subject,node key); node nodeGetValue(node subject,node key); node nodeSetValue(node subject,node key,node value); node nodeInsertKey(node subject,node key); node nodeRemoveKey(node subject,node key); node nodeLoopInsert(node subject,node insert); node nodeLoopRemove(node subject); void *nodeGetState(node subject,node key); void *nodeSetState(node subject,node key,void *state); int nodeReduce(node subject);


// - use array-of-node path? node nodeTraverse(node subject,node key) { return listTraverse((item)subject,(item)key); }

// set nodal value of node/path // - allows null key node nodeGetValue(node subject,node key) { return listGetValue(key?listTraverse((item)subject,(item)key):(item)subject); }

node nodeSetValue(node subject,node key,node value) { // todo: onChange return listSetValue(key?listTraverse((item)subject,(item)key):(item)subject, (item)value); }

// Returns a newly created node node nodeInsert() { return (node)listInsert(); }

// Returns newly created node // - this is just traverse() but with an event raised node nodeInsertKey(node subject,node key) { // todo: onInstall node i = nodeTraverse(subject,key); return i; }

// Returns the node that was removed node nodeRemoveKey(node subject,node key) { // todo: onRemove node i = nodeTraverse(subject,key); // todo: delete return i; }

// Returns the inserted node as the new loop pointer // - this allows it to act as a stack if nodeLOOP (current-loop-node) is updated with returned node // - either can be nodeNULL on entry (for new loop and/or new node) node nodeLoopInsert(node subject,node insert) { if (insert == nodeNULL) subject = insert; if (subject == nodeNULL) subject = insert; node next = nodeGetValue(subject,nodeNEXT); nodeSetValue(insert,nodeNEXT,next); nodeSetValue(subject,nodeNEXT,insert); nodeSetValue(insert,nodePREV,subject); return nodeSetValue(next,nodePREV,insert); }

// Returns the new loop pointer so nodeLOOP can be removed and updated node nodeLoopRemove(node subject) { node prev = nodeGetValue(subject,nodePREV); node next = nodeGetValue(subject,nodeNEXT); nodeSetValue(next,nodePREV,prev); return nodeSetValue(prev,nodeNEXT,next); }

// State is a pointer to a locally meaningful item which is associated with a node // - doesn't need separate get/set since pointer-based, but keeps it more lang-independent void *nodeGetState(node subject,node key) { return *hash(itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf)); }

void *nodeSetState(node subject,node key,void *state) { return *hash(itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf)) = state; }

// - Consumes quanta of execution // - Creates History from change events // - Builds, declares and executes functionality // - Should reduction handle cyles (current-cycle etc), or a separate root-thread // - returns false if no more to reduce int nodeReduce(node subject) { node loop = nodeGetValue(subject,nodeLOOP); if (loop == nodeNULL) return 0; // return if no current-loop-pointer nodeSetValue(subject, nodeLOOP, nodeGetValue(loop, nodeNEXT)); // test NEXT first? if (nodeGetValue(loop, nodeCODE) == nodeTRUE) { ((code)nodeGetState(loop,nodeNULL))(); // execute code-ref returned in state // Later this must declare and build if no function-reference // replace self in loop with n.THEN if non-zero } else nodeReduce(loop); return 1; }