This repository has been archived by the owner on May 31, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 149
/
Copy pathobject.h
85 lines (66 loc) · 1.46 KB
/
object.h
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
//
// object.h
//
// Copyright (c) 2013 TJ Holowaychuk <[email protected]>
//
#ifndef LUNA_OBJECT_H
#define LUNA_OBJECT_H
#include "hash.h"
#include <stdbool.h>
/*
* Check if `val` is the given type.
*/
#define luna_object_is(val, t) ((val)->type == LUNA_TYPE_##t)
/*
* Specific type macros.
*/
#define luna_is_node(val) luna_object_is(val, NODE)
#define luna_is_array(val) luna_object_is(val, ARRAY)
#define luna_is_object(val) luna_object_is(val, OBJECT)
#define luna_is_string(val) luna_object_is(val, STRING)
#define luna_is_float(val) luna_object_is(val, FLOAT)
#define luna_is_int(val) luna_object_is(val, INT)
#define luna_is_bool(val) luna_object_is(val, BOOL)
#define luna_is_null(val) luna_object_is(val, NULL)
/*
* Luna value types.
*/
typedef enum {
LUNA_TYPE_NULL,
LUNA_TYPE_NODE,
LUNA_TYPE_BOOL,
LUNA_TYPE_INT,
LUNA_TYPE_FLOAT,
LUNA_TYPE_STRING,
LUNA_TYPE_OBJECT,
LUNA_TYPE_ARRAY,
LUNA_TYPE_LIST
} luna_object;
/*
* Luna object.
*
* A simple tagged union forming
* the basis of a Luna values.
*/
struct luna_object_struct {
luna_object type;
union {
void *as_pointer;
int as_int;
float as_float;
} value;
};
// protos
void
luna_object_inspect(luna_object_t *self);
luna_object_t *
luna_int_new(int val);
luna_object_t *
luna_float_new(float val);
luna_object_t *
luna_bool_new(bool val);
luna_object_t *
luna_string_new(const char *val);
void
luna_object_free(luna_object_t *self);
#endif /* LUNA_OBJECT_H */