Difference between revisions of "NodeSpace.h"
(prototypes) |
(all are best returning nodes not void) |
||
Line 28: | Line 28: | ||
node nodeSetValue(node subject,node key,node value); | node nodeSetValue(node subject,node key,node value); | ||
node nodeInsertKey(node subject,node key); | 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 *nodeGetState(node subject,node key); | ||
void *nodeSetState(node subject,node key,void *state); | void *nodeSetState(node subject,node key,void *state); | ||
Line 52: | Line 52: | ||
} | } | ||
+ | // Returns newly created node | ||
+ | // - thsi is just traverse() but with an event raised | ||
node nodeInsertKey(node subject,node key) { | node nodeInsertKey(node subject,node key) { | ||
// todo: onInstall | // todo: onInstall | ||
− | node | + | node i = nodeTraverse(subject,key); |
− | + | return i; | |
− | return | ||
} | } | ||
− | + | // Returns the node that was removed | |
+ | node nodeRemoveKey(node subject,node key) { | ||
// todo: onRemove | // 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 nodeCURRENT is updated with returned node) | ||
+ | node nodeLoopInsert(node subject,node insert) { | ||
node next = nodeGetValue(subject,nodeNEXT); | node next = nodeGetValue(subject,nodeNEXT); | ||
nodeSetValue(insert,nodeNEXT,next); | nodeSetValue(insert,nodeNEXT,next); | ||
nodeSetValue(subject,nodeNEXT,insert); | nodeSetValue(subject,nodeNEXT,insert); | ||
nodeSetValue(insert,nodePREV,subject); | nodeSetValue(insert,nodePREV,subject); | ||
− | nodeSetValue(next,nodePREV,insert); | + | return nodeSetValue(next,nodePREV,insert); |
} | } | ||
− | + | // Returns the new loop pointer so nodeCURRENT can be removed and updated | |
+ | node nodeLoopRemove(node subject) { | ||
node prev = nodeGetValue(subject,nodePREV); | node prev = nodeGetValue(subject,nodePREV); | ||
node next = nodeGetValue(subject,nodeNEXT); | node next = nodeGetValue(subject,nodeNEXT); | ||
− | |||
nodeSetValue(next,nodePREV,prev); | nodeSetValue(next,nodePREV,prev); | ||
+ | return nodeSetValue(prev,nodeNEXT,next); | ||
} | } | ||
Revision as of 02:44, 29 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)
- define nodeROOT 0
- define nodeFALSE 0
- define nodeCURRENT 1
- define nodeTRUE 1
- define nodeNEXT 2
- define nodePREV 3
- define nodeTHEN 4
- define nodeCODE 5
// these will have content, so must start after 128 ascii-list-items
- define nodeNETWORK 128
- define nodeDESKTOP 129
- 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 newly created node // - thsi 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 nodeCURRENT is updated with returned node) node nodeLoopInsert(node subject,node 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 nodeCURRENT 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) { itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf); return *hash(nssBuf); }
void *nodeSetState(node subject,node key,void *state) { itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf); return *hash(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 cur; if ((cur = nodeGetValue(subject, nodeCURRENT)) == nodeFALSE) return 0; // return if no CURRENT node nodeSetValue(subject, nodeCURRENT, nodeGetValue(cur, nodeNEXT)); // test NEXT first? if (nodeGetValue(cur, nodeCODE) == nodeTRUE) { ((code)nodeGetState(cur,nodeROOT))(); // 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(cur); return 1; }