summaryrefslogtreecommitdiff
path: root/src/struct.h
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2020-03-14 15:29:52 +0200
committerAdrian Thurston <thurston@colm.net>2020-03-14 15:29:52 +0200
commitf653735830d537715f2885bd832cf04851d35401 (patch)
tree95e6551e39407543366d4f49aedf7b78c6e8bbe1 /src/struct.h
parentbcc54d5df10cf425e7134b06f70d7ffe1abee4e4 (diff)
downloadcolm-f653735830d537715f2885bd832cf04851d35401.tar.gz
moved source files into commit repository
Diffstat (limited to 'src/struct.h')
-rw-r--r--src/struct.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/struct.h b/src/struct.h
new file mode 100644
index 00000000..13f78c40
--- /dev/null
+++ b/src/struct.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2016-2018 Adrian Thurston <thurston@colm.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef _COLM_STRUCT_H
+#define _COLM_STRUCT_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef void (*colm_destructor_t)( struct colm_program *prg,
+ tree_t **sp, struct colm_struct *s );
+
+struct colm_struct
+{
+ short id;
+ struct colm_struct *prev, *next;
+};
+
+/* Must overlay colm_struct. */
+struct colm_inbuilt
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+};
+
+/* Must overlay colm_inbuilt. */
+typedef struct colm_parser
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+
+ struct pda_run *pda_run;
+ struct colm_input *input;
+ tree_t *result;
+} parser_t;
+
+/* Must overlay colm_inbuilt. */
+typedef struct colm_input
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+
+ struct input_impl *impl;
+} input_t;
+
+/* Must overlay colm_inbuilt. */
+typedef struct colm_stream
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+
+ struct stream_impl *impl;
+} stream_t;
+
+#define COLM_LIST_EL_SIZE 2
+typedef struct colm_list_el
+{
+ struct colm_list_el *list_next;
+ struct colm_list_el *list_prev;
+} list_el_t;
+
+/* Must overlay colm_inbuilt. */
+typedef struct colm_list
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+
+ list_el_t *head, *tail;
+ long list_len;
+ struct generic_info *generic_info;
+} list_t;
+
+typedef struct colm_map_el
+{
+ tree_t *key;
+
+ struct colm_map_el *left, *right, *parent;
+ long height;
+
+ struct colm_map_el *next, *prev;
+} map_el_t;
+
+#define COLM_MAP_EL_SIZE ( sizeof(colm_map_el) / sizeof(void*) )
+
+typedef struct colm_map
+{
+ short id;
+ struct colm_struct *prev, *next;
+ colm_destructor_t destructor;
+
+ struct colm_map_el *head, *tail, *root;
+ long tree_size;
+ struct generic_info *generic_info;
+} map_t;
+
+struct colm_struct *colm_struct_new_size( struct colm_program *prg, int size );
+struct colm_struct *colm_struct_new( struct colm_program *prg, int id );
+void colm_struct_add( struct colm_program *prg, struct colm_struct *item );
+void colm_struct_delete( struct colm_program *prg, struct colm_tree **sp,
+ struct colm_struct *el );
+
+struct colm_struct *colm_struct_inbuilt( struct colm_program *prg, int size,
+ colm_destructor_t destructor );
+
+#define colm_struct_get_field( obj, type, field ) \
+ (type)(((void**)(((struct colm_struct*)obj)+1))[field])
+
+#define colm_struct_set_field( obj, type, field, val ) \
+ ((type*)(((struct colm_struct*)obj)+1))[field] = val
+
+#define colm_struct_get_addr( obj, type, field ) \
+ (type)(&(((void **)(((struct colm_struct*)obj)+1))[field]))
+
+#define colm_struct_container( el, field ) \
+ ((void*)el) - (field * sizeof(void*)) - sizeof(struct colm_struct)
+
+#define colm_generic_el_container( prg, el, genId ) \
+ colm_struct_container( el, prg->rtd->generic_info[genId].el_offset )
+
+#define colm_struct_to_list_el( prg, obj, genId ) \
+ colm_struct_get_addr( obj, list_el_t*, prg->rtd->generic_info[genId].el_offset )
+
+#define colm_struct_to_map_el( prg, obj, genId ) \
+ colm_struct_get_addr( obj, map_el_t*, prg->rtd->generic_info[genId].el_offset )
+
+parser_t *colm_parser_new( program_t *prg, struct generic_info *gi, int stop_id, int reducer );
+input_t *colm_input_new( struct colm_program *prg );
+stream_t *colm_stream_new_struct( struct colm_program *prg );
+
+list_t *colm_list_new( struct colm_program *prg );
+struct colm_struct *colm_list_get( struct colm_program *prg, list_t *list,
+ word_t gen_id, word_t field );
+struct colm_struct *colm_list_el_get( struct colm_program *prg,
+ list_el_t *list_el, word_t gen_id, word_t field );
+list_el_t *colm_list_detach_head( list_t *list );
+list_el_t *colm_list_detach_tail( list_t *list );
+long colm_list_length( list_t *list );
+
+map_t *colm_map_new( struct colm_program *prg );
+struct colm_struct *colm_map_el_get( struct colm_program *prg,
+ map_el_t *map_el, word_t gen_id, word_t field );
+struct colm_struct *colm_map_get( struct colm_program *prg, map_t *map,
+ word_t gen_id, word_t field );
+
+struct colm_struct *colm_construct_generic( struct colm_program *prg, long generic_id, int stop_id );
+struct colm_struct *colm_construct_reducer( struct colm_program *prg, long generic_id, int reducer_id );
+struct input_impl *input_to_impl( input_t *ptr );
+struct stream_impl *stream_to_impl( stream_t *ptr );
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* _COLM_STRUCT_H */
+