CFArray.h
3.0 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
92
93
94
95
96
97
98
99
100
101
102
103
104
/* akvirtualcamera, virtual camera for Mac and Windows.
* Copyright (C) 2024 Gonzalo Exequiel Pedone
*
* akvirtualcamera is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* akvirtualcamera is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with akvirtualcamera. If not, see <http://www.gnu.org/licenses/>.
*
* Web-Site: http://webcamoid.github.io/
*/
#ifndef CFARRAY_H
#define CFARRAY_H
#include <vector>
#include "Allocators.h"
#include "CFIndex.h"
#include "CFString.h"
#include "CFType.h"
using CFArray = CFType;
using CFArrayRef = CFTypeRef;
using CFArrayRetainCallBack = const void *(*)(CFAllocatorRef allocator, const void *value);
using CFArrayReleaseCallBack = void (*)(CFAllocatorRef allocator, const void *value);
using CFArrayCopyDescriptionCallBack = CFStringRef(*)(const void *value);
using CFArrayEqualCallBack = bool (*)(const void *value1, const void *value2);
struct CFArrayCallBacks
{
CFArrayRetainCallBack retain;
CFArrayReleaseCallBack release;
CFArrayCopyDescriptionCallBack copyDescription;
CFArrayEqualCallBack equal;
};
struct _CFArrayData
{
std::vector<void *> items;
CFArrayCallBacks callBacks;
_CFArrayData(const void **values,
CFIndex numValues,
const CFArrayCallBacks *callBacks)
{
this->items.resize(numValues);
memcpy(this->items.data(), values, numValues * sizeof(void *));
memcpy(&this->callBacks, callBacks, sizeof(CFArrayCallBacks));
}
};
using _CFArrayDataRef = _CFArrayData *;
inline CFTypeID CFArrayGetTypeID()
{
return 0x3;
}
inline CFArrayRef CFArrayCreate(CFAllocatorRef allocator,
const void **values,
CFIndex numValues,
const CFArrayCallBacks *callBacks)
{
auto arrayType = new CFArray;
arrayType->type = CFArrayGetTypeID();
arrayType->data = new _CFArrayData(values, numValues, callBacks);
arrayType->size = sizeof(_CFArrayData);
arrayType->deleter = [] (void *data) {
auto self = reinterpret_cast<_CFArrayDataRef>(data);
for (auto &item: self->items)
self->callBacks.release(kCFAllocatorDefault, item);
delete self;
};
arrayType->ref = 1;
return arrayType;
}
inline CFIndex CFArrayGetCount(CFArrayRef array)
{
auto self = reinterpret_cast<_CFArrayDataRef>(array->data);
return self->items.size();
}
inline void *CFArrayGetValueAtIndex(CFArrayRef array, CFIndex index)
{
auto self = reinterpret_cast<_CFArrayDataRef>(array->data);
return self->items.at(index);
}
#endif // CFARRAY_H