Difference between revisions of "NodeSpace.h"

From Organic Design wiki
m
(nodes with content must start after 128 ascii list-items)
Line 3: Line 3:
 
// SRC: http://www.organicdesign.co.nz/nodeSpace.c
 
// SRC: http://www.organicdesign.co.nz/nodeSpace.c
  
 +
// Reserved nodes (tmp)
 
#define nodeROOT 0
 
#define nodeROOT 0
 
#define nodeFALSE 0
 
#define nodeFALSE 0
Line 10: Line 11:
 
#define nodeCODE 3
 
#define nodeCODE 3
 
#define nodeTHEN 4
 
#define nodeTHEN 4
#define nodeNETWORK 5
+
 
#define nodeDESKTOP 6
+
// these will have content, so must start after 128 ascii-list-items
#define nodeSTREAMINFO 7
+
#define nodeNETWORK 128
 +
#define nodeDESKTOP 129
 +
#define nodeSTREAMINFO 130
 +
items = 130;            // tmp: next created list-item follows these reserved nodes
  
 
typedef int node;      // node: a type for referring to nodes
 
typedef int node;      // node: a type for referring to nodes

Revision as of 00:46, 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)

  1. define nodeROOT 0
  2. define nodeFALSE 0
  3. define nodeCURRENT 1
  4. define nodeTRUE 1
  5. define nodeAND 2
  6. define nodeCODE 3
  7. define nodeTHEN 4

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

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

items = 130; // tmp: next created list-item follows these reserved nodes

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

// - path is array-of-node node nodeTraverse(node subject,node key) { // select node wco selNode return subject; }

// 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); }

node nodeInsertKey(node subject,node key) { // todo: onInstall node instance; return instance; }

void nodeRemoveKey(node subject,node key) { // todo: onRemove }

void nodeLoopInsert(node subject,node loop) { // add object to the passed loop (do error if not a loop) }

void nodeLoopRemove(node subject) { // remove subject from loop if its currently in one }

// 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, nodeAND)); // test AND 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; }