aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_map.h
blob: 4f0d26e10016b93c0f3f40a9256fb3e306287b0a (plain) (blame)
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
/*
 * %CopyrightBegin%
 * 
 * Copyright Ericsson AB 2013. All Rights Reserved.
 * 
 * The contents of this file are subject to the Erlang Public License,
 * Version 1.1, (the "License"); you may not use this file except in
 * compliance with the License. You should have received a copy of the
 * Erlang Public License along with this software. If not, it can be
 * retrieved online at http://www.erlang.org/.
 * 
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * %CopyrightEnd%
 */


#ifndef __ERL_MAP_H__
#define __ERL_MAP_H__

#include "sys.h"
/* MAP */

typedef struct map_s {
    Eterm thing_word;
    Uint  size;
    Eterm keys;      /* tuple */
} map_t;
/* map node
 *
 * -----------
 * Eterm   THING	
 * Uint    size
 * Eterm   Keys -> {K1, K2, K3, ..., Kn} where n = size
 * ----
 * Eterm   V1
 * ...
 * Eterm   Vn, where n = size
 * -----------
 */



/* erl_term.h stuff */
#define make_map(x)		make_boxed((Eterm*)(x))
#define make_map_rel(x, BASE)   make_boxed_rel((Eterm*)(x),(BASE))
#define is_map(x)		(is_boxed((x)) && is_map_header(*boxed_val((x))))
#define is_map_rel(RTERM,BASE)  is_map(rterm2wterm(RTERM,BASE))
#define is_not_map(x)           (!is_map((x)))
#define is_map_header(x)	(((x) & (_TAG_HEADER_MASK)) == _TAG_HEADER_MAP)
#define header_is_map(x)        ((((x) & (_HEADER_SUBTAG_MASK)) == MAP_SUBTAG))
#define map_val(x)		(_unchecked_boxed_val((x)))
#define map_val_rel(RTERM, BASE) map_val(rterm2wterm(RTERM, BASE))

#define map_get_values(x)      (((Eterm *)(x)) + 3)
#define map_get_keys(x)        (((Eterm *)tuple_val(((map_t *)(x))->keys)) + 1)
#define map_get_size(x)        (((map_t*)(x))->size)

#define MAP_HEADER             _make_header(1,_TAG_HEADER_MAP)
#define MAP_HEADER_SIZE        (sizeof(map_t) / sizeof(Eterm))

#endif