Skip to content

Commit f4061d9

Browse files
authored
add rcarray C++ header (#160)
* add rcarray C++ header
1 parent 639fc7a commit f4061d9

File tree

11 files changed

+234
-18
lines changed

11 files changed

+234
-18
lines changed

.travis.yml

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
language: d
22
sudo: required
3+
addons:
4+
apt:
5+
sources:
6+
- ubuntu-toolchain-r-test
7+
- llvm-toolchain-trusty-5.0
8+
packages:
9+
- g++-7
10+
- gcc-7-multilib
11+
- clang-5.0
312
packages:
413
- pkg-config
514
d:
@@ -12,13 +21,14 @@ branches:
1221
only:
1322
- master
1423
env:
15-
- ARCH="x86_64"
24+
- CC="clang-5.0" CXX="clang++-5.0" ARCH="x86_64"
25+
1626
matrix:
1727
include:
18-
- {os: linux, d: ldc-beta, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
19-
- {os: linux, d: ldc, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
20-
- {os: linux, d: dmd-beta, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
21-
- {os: linux, d: dmd, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
28+
- {os: linux, d: ldc-beta, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"}
29+
- {os: linux, d: ldc, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"}
30+
- {os: linux, d: dmd-beta, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"}
31+
- {os: linux, d: dmd, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"}
2232
allow_failures:
2333
- {d: dmd-nightly}
2434
- {d: ldc-beta}
@@ -37,7 +47,7 @@ script:
3747
- travis_wait 100 dub test --arch "$ARCH" --build=unittest-cov
3848
- travis_wait 100 dub test --arch "$ARCH" -c dips
3949
- ./test_examples.sh
40-
- meson build -D with_test=true && cd build && ninja -j4 && ninja -j4 test -v && cd .. # TODO: 32bit meson test
50+
- meson build -D with_test=true --default-library=static && cd build && ninja -j4 && ninja -j4 test -v && cd .. # TODO: 32bit meson test
4151
# - travis_wait 100 dub test --arch "$ARCH" --build=unittest-release
4252

4353
after_success:

cpp_example/eye.d

+11-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ extern(C++, Space)
1212
return ret;
1313
}
1414

15-
void printMatrix(Slice!(double*, 2) matrix)
15+
void printMatrix(mir_slice!(double*, 2) matrix)
1616
{
1717
import core.stdc.stdio;
1818

@@ -24,3 +24,13 @@ extern(C++, Space)
2424
}
2525
}
2626
}
27+
28+
29+
// Space::printMatrix(mir_slice<double*, 2ul, (mir_slice_kind)2>)
30+
// Space::printMatrix(mir_slice<double*, 2ull, (mir_slice_kind)2>)
31+
// Space::reverseRcSlice(mir_slice<mir_rci<double>, 1ull, (mir_slice_kind)2>&)
32+
33+
//Space::printMatrix(mir_slice<double*, 2ul, (mir_slice_kind)2>)
34+
35+
36+
pragma(msg, printMatrix.mangleof);

cpp_example/init_rcarray.d

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module init_rcarray;
2+
3+
import mir.ndslice;
4+
import mir.rcarray;
5+
6+
extern(C++, Space)
7+
{
8+
void initWithIota(ref RCArray!double a)
9+
{
10+
foreach(i, ref e; a)
11+
e = i;
12+
}
13+
14+
void reverseRcSlice(ref Slice!(RCI!double) a)
15+
{
16+
import mir.utility: swap;
17+
foreach(i; 0 .. a.length / 2)
18+
swap(a[i], a[$ - 1 - i]);
19+
}
20+
}

cpp_example/main.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,40 @@
1+
#include <cassert>
2+
#include <cstdio>
13
#include <cstdlib>
4+
#include "mir/rcarray.h"
25
#include "mir/ndslice.h"
36

47
namespace Space
58
{
69
mir_slice<double*, 2> eye(size_t n);
710
void printMatrix(mir_slice<double*, 2> matrix);
11+
void initWithIota(mir_rcarray<double> &a);
12+
void reverseRcSlice(mir_slice<mir_rci<double>>& a);
813
}
914

1015
int main()
1116
{
1217
mir_slice<double*, 2> matrix = Space::eye(3);
1318
Space::printMatrix(matrix);
1419
std::free(matrix._iterator);
20+
21+
22+
// test rcarray constructors and destructors
23+
mir_rcarray<double> a(3); // [NaN, NaN, NaN]
24+
assert(a.size() == 3);
25+
26+
Space::initWithIota(a); //[0, 1, 2]
27+
auto b = a; // check copy constructor
28+
auto c = b.asSlice();
29+
auto d = c; // check copy constructor
30+
Space::reverseRcSlice(d); //[2, 1, 0]
31+
32+
// reversed 0 1 2 (iota)
33+
assert(a[0] == 2);
34+
assert(a[1] == 1);
35+
assert(a[2] == 0);
36+
37+
assert(d._iterator._iterator == a.data());
38+
1539
return 0;
1640
}

cpp_example/meson.build

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
mir_algorithm_cpp_test_exe = executable(meson.project_name() + '-test',
2+
['eye.d', 'init_rcarray.d', 'main.cpp'],
3+
include_directories: mir_algorithm_dir,
4+
dependencies: mir_algorithm_dep,
5+
)
6+
7+
test(meson.project_name() + '-cpp-test', mir_algorithm_cpp_test_exe)

cpp_example/run.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
ldmd2 -betterC -O -inline -release eye.d -I../source -c
1+
ldmd2 -betterC -O -inline -release eye.d init_rcarray.d -I../source -c
22
g++ main.cpp eye.o -std=c++11 -I../include
33
./a.out

include/mir/ndslice.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,25 @@ License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
88
Copyright: Copyright © 2017-, Ilya Yaroshenko
99
Authors: Ilya Yaroshenko
1010
*/
11+
12+
#ifndef MIR_NDSLICE
13+
14+
#define MIR_NDSLICE
15+
1116
#include <cstddef>
1217
#include <cstdint>
1318

1419
#if INTPTR_MAX == INT32_MAX
1520
#define mir_size_t unsigned int
1621
#define mir_ptrdiff_t int
1722
#elif INTPTR_MAX == INT64_MAX
18-
#define mir_size_t unsigned long long
19-
#define mir_ptrdiff_t long long
23+
#ifdef _WIN32
24+
#define mir_size_t unsigned long long
25+
#define mir_ptrdiff_t long long
26+
#else
27+
#define mir_size_t unsigned long
28+
#define mir_ptrdiff_t long
29+
#endif
2030
#else
2131
#error "Environment not 32 or 64-bit."
2232
#endif
@@ -40,3 +50,5 @@ struct mir_slice
4050
mir_ptrdiff_t _strides[kind == mir_slice_kind::universal ? N : kind == mir_slice_kind::canonical ? N - 1 : 0];
4151
Iterator _iterator;
4252
};
53+
54+
#endif

include/mir/rcarray.h

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#ifndef MIR_RCARRAY
2+
3+
#define MIR_RCARRAY
4+
5+
#include <cassert>
6+
#include <stdexcept>
7+
#include "mir/ndslice.h"
8+
9+
template <typename T>
10+
struct mir_rci;
11+
12+
template <typename T>
13+
struct mir_rcarray
14+
{
15+
private:
16+
17+
void* _context;
18+
19+
public:
20+
21+
~mir_rcarray();
22+
mir_rcarray(mir_rcarray& rhs);
23+
bool initialize(size_t length, unsigned int alignment, bool deallocate, bool initialize);
24+
25+
mir_slice<mir_rci<T>> asSlice();
26+
27+
inline mir_rcarray(size_t length, unsigned int alignment = alignof(T), bool deallocate = true, bool initialize = true)
28+
{
29+
if (!this->initialize(length, alignment, deallocate, initialize))
30+
{
31+
throw std::runtime_error("mir_rcarray: out of memory arror.");
32+
}
33+
}
34+
35+
inline size_t size() noexcept
36+
{
37+
return _context ? *(size_t*)((char*)_context + sizeof(void*)) : 0;
38+
}
39+
40+
inline T& at(size_t index)
41+
{
42+
assert(index < this->size());
43+
return ((T*)((char*)_context + sizeof(void*) * 4))[index];
44+
}
45+
46+
inline const T& at(size_t index) const
47+
{
48+
assert(index < this->size());
49+
return ((const T*)((char*)_context + sizeof(void*) * 4))[index];
50+
}
51+
52+
inline T& operator[](size_t index)
53+
{
54+
assert(index < this->size());
55+
return ((T*)((char*)_context + sizeof(void*) * 4))[index];
56+
}
57+
58+
inline const T& operator[](size_t index) const
59+
{
60+
assert(index < this->size());
61+
return ((const T*)((char*)_context + sizeof(void*) * 4))[index];
62+
}
63+
64+
inline T* data() noexcept
65+
{
66+
return _context ? (T*)((char*)_context + sizeof(void*) * 4) : NULL;
67+
}
68+
69+
inline T* begin() noexcept
70+
{
71+
return _context ? (T*)((char*)_context + sizeof(void*) * 4) : NULL;
72+
}
73+
74+
inline const T* cbegin() const noexcept
75+
{
76+
return _context ? (const T*)((char*)_context + sizeof(void*) * 4) : NULL;
77+
}
78+
79+
inline T* end() noexcept
80+
{
81+
return this->begin() + this->size();
82+
}
83+
84+
inline const T* cend() const noexcept
85+
{
86+
return this->cbegin() + this->size();
87+
}
88+
};
89+
90+
91+
template <typename T>
92+
struct mir_rci
93+
{
94+
public:
95+
96+
T* _iterator;
97+
mir_rcarray<T> _array;
98+
99+
~mir_rci() = default;
100+
mir_rci(mir_rci& rhs) = default;
101+
};
102+
103+
#endif

include/mir/series.h

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#ifndef MIR_SERIES
2+
3+
#define MIR_SERIES
4+
15
#include "mir/ndslice.h"
26

37
template <
@@ -21,3 +25,5 @@ struct mir_series
2125
mir_slice<Iterator, N, kind> _data;
2226
IndexIterator _index;
2327
};
28+
29+
#endif

meson.build

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
1-
project('mir-algorithm', 'd', version : '3.1.0', license: 'BSL-1.0')
1+
project('mir-algorithm', 'cpp', 'd', version : '3.1.0', license: 'BSL-1.0',
2+
default_options : ['cpp_std=c++1z'])
3+
4+
5+
add_global_arguments([
6+
'-dip1008',
7+
], language: 'd')
8+
9+
add_project_arguments([
10+
'-dip25',
11+
'-dip1000',
12+
], language: 'd')
13+
214

315
mir_algorithm_dir = include_directories('source/', 'include/')
416

@@ -89,4 +101,6 @@ if get_option('with_test')
89101

90102
test(meson.project_name() + '-test', mir_algorithm_test_exe)
91103

104+
subdir('cpp_example')
105+
92106
endif

source/mir/rcarray.d

+17-7
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,20 @@ struct mir_rcarray(T)
136136
}
137137

138138
///
139+
pragma(inline, false)
139140
this(ref typeof(this) rhs) pure nothrow @nogc
140141
{
141142
this._context = rhs._context;
142143
this.__xpostblit;
143144
}
145+
146+
///
147+
auto asSlice() scope return @property
148+
{
149+
import mir.ndslice.slice: mir_slice;
150+
alias It = mir_rci!T;
151+
return mir_slice!It([length], It((()@trusted => ptr)(), this));
152+
}
144153
}
145154
else
146155
{
@@ -156,6 +165,14 @@ struct mir_rcarray(T)
156165
{
157166
return initializeImpl(length, alignment, deallocate, initialize);
158167
}
168+
169+
///
170+
auto asSlice()() scope return @property
171+
{
172+
import mir.ndslice.slice: mir_slice;
173+
alias It = mir_rci!T;
174+
return mir_slice!It([length], It((()@trusted => ptr)(), this));
175+
}
159176
}
160177

161178
///
@@ -344,13 +361,6 @@ struct mir_rcarray(T)
344361
{
345362
return _context !is null ? _context.length : 0;
346363
}
347-
348-
auto asSlice()() scope return @property
349-
{
350-
import mir.ndslice.slice: mir_slice;
351-
alias It = mir_rci!T;
352-
return mir_slice!It([length], It((()@trusted => ptr)(), this));
353-
}
354364
}
355365

356366
/// ditto

0 commit comments

Comments
 (0)