Difference between revisions of "ListSpace.c"

From Organic Design wiki
 
m
Line 1: Line 1:
// Create a new listItem in the space and return its index
+
// Create a new listItem in the space and return its index
int listInsert() {
+
int listInsert() {
//printf("listInsert(): new item %d\n", items);
+
                //printf("listInsert(): new item %d\n", items);
return items++;
+
                return items++;
}
+
                }
  
// Start at subject listItem and traverse the object as an association to a new listItem
+
// Start at subject listItem and traverse the object as an association to a new listItem
// - object is also a listItem reference and its binary address is used as the traversal path
+
// - object is also a listItem reference and its binary address is used as the traversal path
// - subject and object (all list-item references are ints starting at item 0)
+
// - subject and object (all list-item references are ints starting at item 0)
int listTraverse( int subject, int object ) {
+
int listTraverse( int subject, int object ) {
object += 2; // tmp: can't traverse items 0 or 1
+
                object += 2; // tmp: can't traverse items 0 or 1
int i;
+
                int i;
for ( i = 1; i <= object >> 1; i <<= 1 ) {
+
                for ( i = 1; i <= object >> 1; i <<= 1 ) {
int *addr = space + subject * 3 + (object & i ? 1 : 0);
+
                int *addr = space + subject * 3 + (object & i ? 1 : 0);
subject = *addr ? *addr : (*addr = listInsert());
+
                subject = *addr ? *addr : (*addr = listInsert());
}
+
                }
return subject;
+
                return subject;
}
+
                }
  
// Get the value (payload key) of the subject Item
+
// Get the value (payload key) of the subject Item
int listGetValue( int subject ) {
+
int listGetValue( int subject ) {
int *addr = space + subject * 3 + 2;
+
                int *addr = space + subject * 3 + 2;
return *addr;
+
                return *addr;
}
+
                }
  
// Set the payload key of the subject Item to the passed value
+
// Set the payload key of the subject Item to the passed value
void listSetValue( int subject, int value ) {
+
void listSetValue( int subject, int value ) {
int *addr = space + subject * 3 + 2;
+
                int *addr = space + subject * 3 + 2;
*addr = value;
+
                *addr = value;
}
+
                }

Revision as of 07:36, 1 July 2006

// Create a new listItem in the space and return its index int listInsert() {

               //printf("listInsert(): new item %d\n", items);
               return items++;
               }

// Start at subject listItem and traverse the object as an association to a new listItem // - object is also a listItem reference and its binary address is used as the traversal path // - subject and object (all list-item references are ints starting at item 0) int listTraverse( int subject, int object ) {

               object += 2; // tmp: can't traverse items 0 or 1
               int i;
               for ( i = 1; i <= object >> 1; i <<= 1 ) {

int *addr = space + subject * 3 + (object & i ? 1 : 0); subject = *addr ? *addr : (*addr = listInsert()); }

               return subject;
               }

// Get the value (payload key) of the subject Item int listGetValue( int subject ) {

               int *addr = space + subject * 3 + 2;
               return *addr;
               }

// Set the payload key of the subject Item to the passed value void listSetValue( int subject, int value ) {

               int *addr = space + subject * 3 + 2;
               *addr = value;
               }