-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObject.h
More file actions
91 lines (70 loc) · 2.66 KB
/
Copy pathObject.h
File metadata and controls
91 lines (70 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef JSON_PARSER_OBJECT_
#define JSON_PARSER_OBJECT_
#include <stdint.h>
#include <stdio.h>
#include "String.h"
#include "Array.h"
#include "types.h"
#define HASHMAP_INIT_SIZE 16
// Be careful while changing this.
// Indexing is based on the masking because of this being 2
#define HASHMAP_M_FACTOR 2
#define REHASH_FACTOR 0.75f
struct Element {
enum JSONType type;
void *value;
};
struct KeyValuePair {
String key;
struct Element element;
size_t _stamp; // Insertion/updation order stamp
};
struct NodeKVP {
struct KeyValuePair NODE;
struct NodeKVP* NEXT;
};
struct Object {
struct NodeKVP** arr;
size_t element_count, arr_size;
size_t _count;
// ITERATION fields
struct KeyValuePair* _ordered;
int32_t _iter;
};
// To be used by user, "API"
struct Object create_object();
void delete_object(struct Object obj);
/*
* WARNING:
* This function has an amortized complexity of O(1).
* It must not be used to partially iterate over hashmap.
*
* This function allows for a insertion(/updation) order traversal.
*/
struct KeyValuePair* next_element(struct Object* obj);
struct Object copy_object(struct Object obj);
struct KeyValuePair* get_kvp_for_key(struct Object* obj, String key);
enum JSONType get_type_for_key(struct Object* obj, String key);
void* get_value_for_key(struct Object* obj, String key);
// DO NOT USE THESE FUNCTIONS IF NOT SURE ABOUT THE TYPE
int get_int32_t_for_key(struct Object* obj, String key);
int64_t get_int64_t_for_key(struct Object* obj, String key);
double get_double_for_key(struct Object* obj, String key);
char get_char_for_key(struct Object* obj, String key);
String* get_string_for_key(struct Object* obj, String key);
struct Object* get_object_for_key(struct Object* obj, String key);
Array* get_array_for_key(struct Object* obj, String key);
bool get_bool_for_key(struct Object* obj, String key);
void set_value_for_key(struct Object* obj, String key, enum JSONType type, void* value);
void set_int32_t_for_key(struct Object* obj, String key, int x);
void set_int64_t_for_key(struct Object* obj, String key, int64_t x);
void set_double_for_key(struct Object* obj, String key, double x);
void set_char_for_key(struct Object* obj, String key, char x);
void set_string_for_key(struct Object* obj, String key, String x);
void set_object_for_key(struct Object* obj, String key, struct Object x);
void set_array_for_key(struct Object* obj, String key, Array x);
void set_bool_for_key(struct Object* obj, String key, bool x);
void set_null_for_key(struct Object* obj, String key);
void dump_json(FILE* fp, struct Element el, size_t indent);
struct Element load_json(FILE* fp);
#endif // JSON_PARSER_OBJECT_