Lichen

templates/ops.h

319:e39bf1c565b8
2016-12-05 Paul Boddie Changed multiple assignment detection to distinguish between different objects of the same kind.
     1 /* Common operations. */     2      3 #ifndef __OPS_H__     4 #define __OPS_H__     5      6 #include "types.h"     7 #include <string.h> /* for __COPY */     8      9 /* Direct access and manipulation of static objects. */    10     11 __attr __load_static(__ref parent, __ref obj);    12     13 /* Direct retrieval operations, returning attributes. */    14     15 __attr __load_via_class(__ref obj, int pos);    16 __attr __load_via_object(__ref obj, int pos);    17 __attr __get_class_and_load(__ref obj, int pos);    18     19 /* Direct storage operations. */    20     21 int __store_via_object(__ref obj, int pos, __attr value);    22 int __get_class_and_store(__ref obj, int pos, __attr value);    23     24 /* Introspection. */    25     26 int __is_instance(__ref obj);    27 int __is_type_instance(__ref obj);    28 __ref __get_class(__ref obj);    29 __attr __get_class_attr(__ref obj);    30     31 /* Attribute testing operations. */    32     33 __ref __test_specific_instance(__ref obj, __ref type);    34 __ref __test_specific_object(__ref obj, __ref type);    35 __ref __test_specific_type(__ref obj, __ref type);    36 __ref __test_common_instance(__ref obj, int pos, int code);    37 __ref __test_common_object(__ref obj, int pos, int code);    38 __ref __test_common_type(__ref obj, int pos, int code);    39     40 /* Attribute testing and retrieval operations. */    41     42 __attr __check_and_load_via_class(__ref obj, int pos, int code);    43 __attr __check_and_load_via_object(__ref obj, int pos, int code);    44 __attr __check_and_load_via_any(__ref obj, int pos, int code);    45     46 /* Attribute testing and storage operations. */    47     48 int __check_and_store_via_class(__ref obj, int pos, int code, __attr value);    49 int __check_and_store_via_object(__ref obj, int pos, int code, __attr value);    50 int __check_and_store_via_any(__ref obj, int pos, int code, __attr value);    51     52 /* Context-related operations. */    53     54 __attr __test_context(__ref context, __attr attr);    55 __attr __replace_context(__ref context, __attr attr);    56 __attr __update_context(__ref context, __attr attr);    57     58 #define __set_context(__ATTR) (__tmp_context = (__ATTR).value)    59 #define __set_accessor(__ATTR) (__tmp_value = (__ATTR).value)    60     61 /* Basic structure tests. */    62     63 int __WITHIN(__ref obj, int pos);    64 int __HASATTR(__ref obj, int pos, int code);    65     66 /* Parameter position operations. */    67     68 int __HASPARAM(const __ptable *ptable, int ppos, int pcode);    69     70 /* Conversions. */    71     72 __attr __CONTEXT_AS_VALUE(__attr attr);    73     74 /* Type testing. */    75     76 __ref __ISFUNC(__ref obj);    77 int __ISNULL(__attr value);    78     79 /* __TEST(obj, __A) -> test obj for the special type attribute __A */    80     81 #define __TEST(__OBJ, __TYPE) (__test_common_instance(__OBJ, __pos_##__TYPE, __code_##__TYPE))    82     83 /* Attribute codes and positions for type objects. */    84     85 unsigned int __TYPECODE(__ref obj);    86 unsigned int __TYPEPOS(__ref obj);    87     88 /* Attribute codes and positions for attribute names. */    89     90 #define __ATTRCODE(__ATTRNAME) (__code_##__ATTRNAME)    91 #define __ATTRPOS(__ATTRNAME) (__pos_##__ATTRNAME)    92     93 /* Memory allocation. */    94     95 void *__ALLOCATE(size_t nmemb, size_t size);    96 void *__REALLOCATE(void *ptr, size_t size);    97     98 /* Copying of structures. */    99    100 __ref __COPY(__ref obj, int size);   101    102 #endif /* __OPS_H__ */