-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathDomain.cs
178 lines (161 loc) · 4.63 KB
/
Domain.cs
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System;
using TileDB.CSharp.Marshalling.SafeHandles;
using TileDB.Interop;
namespace TileDB.CSharp;
public sealed unsafe class Domain : IDisposable
{
private readonly DomainHandle _handle;
private readonly Context _ctx;
private bool _disposed;
public Domain(Context ctx)
{
_ctx = ctx;
_handle = DomainHandle.Create(_ctx);
}
internal Domain(Context ctx, DomainHandle handle)
{
_ctx = ctx;
_handle = handle;
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (_disposed) return;
if (disposing && (!_handle.IsInvalid))
{
_handle.Dispose();
}
_disposed = true;
}
internal DomainHandle Handle => _handle;
#region capi functions
/// <summary>
/// Get type of homogenous dimensions. Will throw exception for heterogeneous dimensions.
/// </summary>
/// <returns></returns>
public DataType Type()
{
using var ctxHandle = _ctx.Handle.Acquire();
using var handle = _handle.Acquire();
tiledb_datatype_t tiledb_datatype;
_ctx.handle_error(Methods.tiledb_domain_get_type(ctxHandle, handle, &tiledb_datatype));
return (DataType)tiledb_datatype;
}
/// <summary>
/// Get number of dimensions.
/// </summary>
/// <returns></returns>
public uint NDim()
{
using var ctxHandle = _ctx.Handle.Acquire();
using var handle = _handle.Acquire();
uint ndim;
_ctx.handle_error(Methods.tiledb_domain_get_ndim(ctxHandle, handle, &ndim));
return ndim;
}
/// <summary>
/// Add a dimension.
/// </summary>
/// <param name="d"></param>
public void AddDimension(Dimension d)
{
using var ctxHandle = _ctx.Handle.Acquire();
using var handle = _handle.Acquire();
using var dHandle = d.Handle.Acquire();
_ctx.handle_error(Methods.tiledb_domain_add_dimension(ctxHandle, handle, dHandle));
}
/// <summary>
/// Add dimensions.
/// </summary>
/// <param name="d"></param>
public void AddDimensions(params Dimension[] d)
{
foreach (var t in d)
{
AddDimension(t);
}
}
/// <summary>
/// Get a dimension from index.
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Dimension Dimension(uint index)
{
var handle = new DimensionHandle();
var successful = false;
tiledb_dimension_t* dimension_p = null;
try
{
using (var ctxHandle = _ctx.Handle.Acquire())
using (var domainHandle = _handle.Acquire())
{
_ctx.handle_error(Methods.tiledb_domain_get_dimension_from_index(ctxHandle, domainHandle, index, &dimension_p));
}
successful = true;
}
finally
{
if (successful)
{
handle.InitHandle(dimension_p);
}
else
{
handle.SetHandleAsInvalid();
}
}
return new Dimension(_ctx, handle);
}
/// <summary>
/// Get a dimension from name.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public Dimension Dimension(string name)
{
var handle = new DimensionHandle();
var successful = false;
tiledb_dimension_t* dimension_p = null;
try
{
using (var ctxHandle = _ctx.Handle.Acquire())
using (var domainHandle = _handle.Acquire())
using (var ms_name = new MarshaledString(name))
{
_ctx.handle_error(Methods.tiledb_domain_get_dimension_from_name(ctxHandle, domainHandle, ms_name, &dimension_p));
}
successful = true;
}
finally
{
if (successful)
{
handle.InitHandle(dimension_p);
}
else
{
handle.SetHandleAsInvalid();
}
}
return new Dimension(_ctx, handle);
}
/// <summary>
/// Test if a dimension with name exists or not.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool HasDimension(string name)
{
using var ctxHandle = _ctx.Handle.Acquire();
using var handle = _handle.Acquire();
int has_dim;
using var ms_name = new MarshaledString(name);
_ctx.handle_error(Methods.tiledb_domain_has_dimension(ctxHandle, handle, ms_name, &has_dim));
return has_dim > 0;
}
#endregion
}