aboutsummaryrefslogtreecommitdiff
path: root/include/salticidae/type.h
blob: 0bc2ae0943268746e92f5b3d32c431ce9f872a62 (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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
 * Copyright (c) 2018 Cornell University.
 *
 * Author: Ted Yin <tederminant@gmail.com>
 *
 * 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 _SALTICIDAE_TYPE_H
#define _SALTICIDAE_TYPE_H

#include "config.h"

#ifdef __cplusplus
#include <vector>
#include <string>
#include <cstring>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <ios>
#include <functional>
#include <mutex>

namespace salticidae {

const auto _1 = std::placeholders::_1;
const auto _2 = std::placeholders::_2;

using bytearray_t = std::vector<uint8_t>;
using mutex_lg_t = std::lock_guard<std::mutex>;
using mutex_ul_t = std::unique_lock<std::mutex>;

template<typename T> T htole(T) = delete;
template<> inline uint16_t htole<uint16_t>(uint16_t x) { return htole16(x); }
template<> inline uint32_t htole<uint32_t>(uint32_t x) { return htole32(x); }
template<> inline uint64_t htole<uint64_t>(uint64_t x) { return htole64(x); }

template<typename T> T letoh(T) = delete;
template<> inline uint16_t letoh<uint16_t>(uint16_t x) { return le16toh(x); }
template<> inline uint32_t letoh<uint32_t>(uint32_t x) { return le32toh(x); }
template<> inline uint64_t letoh<uint64_t>(uint64_t x) { return le64toh(x); }

template<typename... >
using void_t = void;

template <typename T, typename = void>
struct is_ranged : std::false_type {};

template <typename T>
struct is_ranged<T,
    void_t<decltype(std::declval<T>().begin()),
            decltype(std::declval<T>().end())>> : std::true_type {};

template<size_t N>
struct log2 {
    enum {
        value = 1 + log2<N / 2>::value
    };
};

template<>
struct log2<0> {
   enum { value = 0 };
};

template<>
struct log2<1> {
   enum { value = 0 };
};

template<typename ClassType, typename ReturnType, typename... Args, typename... FArgs>
inline auto generic_bind(ReturnType(ClassType::* f)(Args...), FArgs&&... fargs) {
    return std::function<ReturnType(Args...)>(std::bind(f, std::forward<FArgs>(fargs)...));
}

}

#ifdef SALTICIDAE_CBINDINGS
using bytearray_t = salticidae::bytearray_t;
#endif

#else

#include <stdint.h>
#ifdef SALTICIDAE_CBINDINGS
typedef struct bytearray_t bytearray_t;
#endif

#endif

#ifdef SALTICIDAE_CBINDINGS_STR_OP
typedef char * _opcode_t;
#else
typedef uint8_t _opcode_t;
#endif

#ifdef SALTICIDAE_CBINDINGS
#ifdef __cplusplus
extern "C" {
#endif

bytearray_t *bytearray_new();
uint8_t *bytearray_data(bytearray_t *arr);
size_t bytearray_size(bytearray_t *arr);
void bytearray_free(bytearray_t *arr);

#ifdef __cplusplus
}
#endif
#endif

#endif