From 7816ad9acb2748c8350c1d1603c92ae31bd44cc4 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Sun, 18 Nov 2018 21:19:51 +0700 Subject: [PATCH 01/17] add rcarray C++ header --- cpp_example/init_rcarray.d | 20 +++++++++++++++++++ cpp_example/main.cpp | 20 +++++++++++++++++++ cpp_example/run.sh | 2 +- include/mir/rcarray.h | 40 ++++++++++++++++++++++++++++++++++++++ source/mir/rcarray.d | 24 ++++++++++++++++------- 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 cpp_example/init_rcarray.d create mode 100644 include/mir/rcarray.h diff --git a/cpp_example/init_rcarray.d b/cpp_example/init_rcarray.d new file mode 100644 index 00000000..294913fc --- /dev/null +++ b/cpp_example/init_rcarray.d @@ -0,0 +1,20 @@ +module init_rcarray; + +import mir.ndslice; +import mir.rcarray; + +extern(C++, Space) +{ + void iotaWithIota(ref RCArray!double a) + { + foreach(i, ref e; a) + e = i; + } + + void reverseRcSlice(ref Slice!(RCArray!double) a) + { + import mir.utility: swap; + foreach(i; 0 .. a.length / 2) + swap(a[i], a[$ - 1 - i]); + } +} diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index ce221ade..74323465 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -1,3 +1,4 @@ +#include #include #include "mir/ndslice.h" @@ -5,6 +6,8 @@ namespace Space { mir_slice eye(size_t n); void printMatrix(mir_slice matrix); + void iotaWithIota(mir_rcarray& a); + void reverseRcSlice(mir_slice>& a); } int main() @@ -12,5 +15,22 @@ int main() mir_slice matrix = Space::eye(3); Space::printMatrix(matrix); std::free(matrix._iterator); + + + // test rcarray constructors and destructors + mir_rcarray a(3); + Space::iotaWithIota(a); + auto b = a; + auto c = b.asSlice; + auto d = c; + Space::reverseRcSlice(d); + auto e = a.asSlice; + + printf("%f %f %f", + e._iterator._iterator[0], + e._iterator._iterator[1], + e._iterator._iterator[2], + ); + return 0; } diff --git a/cpp_example/run.sh b/cpp_example/run.sh index c2f94bf4..abf24d0f 100644 --- a/cpp_example/run.sh +++ b/cpp_example/run.sh @@ -1,3 +1,3 @@ -ldmd2 -betterC -O -inline -release eye.d -I../source -c +ldmd2 -betterC -O -inline -release eye.d init_rcarray.d -I../source -c g++ main.cpp eye.o -std=c++11 -I../include ./a.out diff --git a/include/mir/rcarray.h b/include/mir/rcarray.h new file mode 100644 index 00000000..fd0ababb --- /dev/null +++ b/include/mir/rcarray.h @@ -0,0 +1,40 @@ + +#include +#include "mir/ndslice.h" + +template +struct mir_rcarray +{ +private: + + void* _context; + +public: + + ~mir_rcarray(); + mir_rcarray(mir_rcarray& rhs); + bool initialize(size_t length, uint alignment = 16, bool deallocate, bool initialize); + + mir_slice> asSlice(); + + inline mir_rcarray(size_t length, uint alignment = alignof(T), bool deallocate = true, bool initialize = true) + { + if (!initialize(length, alignment, deallocate, initialize) + { + throw runtime_error("mir_rcarray: out of memory arror."); + } + } +}; + + +template +struct mir_rci +{ + T* _iterator; + mir_rcarray _array; + +public: + + ~mir_rci() = default; + mir_rci(mir_rci& rhs) = default; +} diff --git a/source/mir/rcarray.d b/source/mir/rcarray.d index 02306788..f39cf181 100644 --- a/source/mir/rcarray.d +++ b/source/mir/rcarray.d @@ -136,11 +136,20 @@ struct mir_rcarray(T) } /// + pragma(inline, false) this(ref typeof(this) rhs) pure nothrow @nogc { this._context = rhs._context; this.__xpostblit; } + + /// + auto asSlice() scope return @property + { + import mir.ndslice.slice: mir_slice; + alias It = mir_rci!T; + return mir_slice!It([length], It((()@trusted => ptr)(), this)); + } } else { @@ -156,6 +165,14 @@ struct mir_rcarray(T) { return initializeImpl(length, alignment, deallocate, initialize); } + + /// + auto asSlice()() scope return @property + { + import mir.ndslice.slice: mir_slice; + alias It = mir_rci!T; + return mir_slice!It([length], It((()@trusted => ptr)(), this)); + } } /// @@ -344,13 +361,6 @@ struct mir_rcarray(T) { return _context !is null ? _context.length : 0; } - - auto asSlice()() scope return @property - { - import mir.ndslice.slice: mir_slice; - alias It = mir_rci!T; - return mir_slice!It([length], It((()@trusted => ptr)(), this)); - } } /// ditto From fe4326ec383996ad3d758f5f256cc32cca00205a Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 19:36:41 +0700 Subject: [PATCH 02/17] ditto --- cpp_example/eye.d | 12 +++++++++++- cpp_example/init_rcarray.d | 4 ++-- cpp_example/main.cpp | 12 ++++++------ cpp_example/meson.build | 7 +++++++ include/mir/ndslice.h | 11 +++++++++-- include/mir/rcarray.h | 18 +++++++++++++----- include/mir/series.h | 6 ++++++ meson.build | 16 +++++++++++++++- 8 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 cpp_example/meson.build diff --git a/cpp_example/eye.d b/cpp_example/eye.d index dd912131..684ef322 100644 --- a/cpp_example/eye.d +++ b/cpp_example/eye.d @@ -12,7 +12,7 @@ extern(C++, Space) return ret; } - void printMatrix(Slice!(double*, 2) matrix) + void printMatrix(mir_slice!(double*, 2) matrix) { import core.stdc.stdio; @@ -24,3 +24,13 @@ extern(C++, Space) } } } + + +// Space::printMatrix(mir_slice) +// Space::printMatrix(mir_slice) +// Space::reverseRcSlice(mir_slice, 1ull, (mir_slice_kind)2>&) + +//Space::printMatrix(mir_slice) + + +pragma(msg, printMatrix.mangleof); \ No newline at end of file diff --git a/cpp_example/init_rcarray.d b/cpp_example/init_rcarray.d index 294913fc..a73a4fc5 100644 --- a/cpp_example/init_rcarray.d +++ b/cpp_example/init_rcarray.d @@ -5,13 +5,13 @@ import mir.rcarray; extern(C++, Space) { - void iotaWithIota(ref RCArray!double a) + void initWithIota(ref RCArray!double a) { foreach(i, ref e; a) e = i; } - void reverseRcSlice(ref Slice!(RCArray!double) a) + void reverseRcSlice(ref Slice!(RCI!double) a) { import mir.utility: swap; foreach(i; 0 .. a.length / 2) diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index 74323465..6914b277 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -1,12 +1,13 @@ #include #include +#include "mir/rcarray.h" #include "mir/ndslice.h" namespace Space { mir_slice eye(size_t n); void printMatrix(mir_slice matrix); - void iotaWithIota(mir_rcarray& a); + void initWithIota(mir_rcarray &a); void reverseRcSlice(mir_slice>& a); } @@ -19,18 +20,17 @@ int main() // test rcarray constructors and destructors mir_rcarray a(3); - Space::iotaWithIota(a); + Space::initWithIota(a); auto b = a; - auto c = b.asSlice; + auto c = b.asSlice(); auto d = c; Space::reverseRcSlice(d); - auto e = a.asSlice; + auto e = a.asSlice(); printf("%f %f %f", e._iterator._iterator[0], e._iterator._iterator[1], - e._iterator._iterator[2], - ); + e._iterator._iterator[2]); return 0; } diff --git a/cpp_example/meson.build b/cpp_example/meson.build new file mode 100644 index 00000000..c40029e8 --- /dev/null +++ b/cpp_example/meson.build @@ -0,0 +1,7 @@ +mir_algorithm_cpp_test_exe = executable(meson.project_name() + '-test', + ['eye.d', 'init_rcarray.d', 'main.cpp'], + include_directories: mir_algorithm_dir, + dependencies: mir_algorithm_dep, +) + +test(meson.project_name() + '-test', mir_algorithm_cpp_test_exe) diff --git a/include/mir/ndslice.h b/include/mir/ndslice.h index 3c522565..64520d30 100644 --- a/include/mir/ndslice.h +++ b/include/mir/ndslice.h @@ -8,6 +8,11 @@ License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0). Copyright: Copyright © 2017-, Ilya Yaroshenko Authors: Ilya Yaroshenko */ + +#ifndef MIR_NDSLICE + +#define MIR_NDSLICE + #include #include @@ -15,8 +20,8 @@ Authors: Ilya Yaroshenko #define mir_size_t unsigned int #define mir_ptrdiff_t int #elif INTPTR_MAX == INT64_MAX - #define mir_size_t unsigned long long - #define mir_ptrdiff_t long long + #define mir_size_t unsigned long + #define mir_ptrdiff_t long #else #error "Environment not 32 or 64-bit." #endif @@ -40,3 +45,5 @@ struct mir_slice mir_ptrdiff_t _strides[kind == mir_slice_kind::universal ? N : kind == mir_slice_kind::canonical ? N - 1 : 0]; Iterator _iterator; }; + +#endif diff --git a/include/mir/rcarray.h b/include/mir/rcarray.h index fd0ababb..1c8db090 100644 --- a/include/mir/rcarray.h +++ b/include/mir/rcarray.h @@ -1,7 +1,13 @@ +#ifndef MIR_RCARRAY + +#define MIR_RCARRAY #include #include "mir/ndslice.h" +template +struct mir_rci; + template struct mir_rcarray { @@ -13,15 +19,15 @@ struct mir_rcarray ~mir_rcarray(); mir_rcarray(mir_rcarray& rhs); - bool initialize(size_t length, uint alignment = 16, bool deallocate, bool initialize); + bool initialize(size_t length, unsigned int alignment, bool deallocate, bool initialize); mir_slice> asSlice(); - inline mir_rcarray(size_t length, uint alignment = alignof(T), bool deallocate = true, bool initialize = true) + inline mir_rcarray(size_t length, unsigned int alignment = alignof(T), bool deallocate = true, bool initialize = true) { - if (!initialize(length, alignment, deallocate, initialize) + if (!this->initialize(length, alignment, deallocate, initialize)) { - throw runtime_error("mir_rcarray: out of memory arror."); + throw std::runtime_error("mir_rcarray: out of memory arror."); } } }; @@ -37,4 +43,6 @@ struct mir_rci ~mir_rci() = default; mir_rci(mir_rci& rhs) = default; -} +}; + +#endif diff --git a/include/mir/series.h b/include/mir/series.h index d01434d5..8035a68d 100644 --- a/include/mir/series.h +++ b/include/mir/series.h @@ -1,3 +1,7 @@ +#ifndef MIR_SERIES + +#define MIR_SERIES + #include "mir/ndslice.h" template < @@ -21,3 +25,5 @@ struct mir_series mir_slice _data; IndexIterator _index; }; + +#endif diff --git a/meson.build b/meson.build index d8dc6597..dd004065 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,16 @@ -project('mir-algorithm', 'd', version : '3.1.0', license: 'BSL-1.0') +project('mir-algorithm', 'cpp', 'd', version : '3.1.0', license: 'BSL-1.0', + default_options : ['cpp_std=c++1z']) + + +add_global_arguments([ + '-dip1008', + ], language: 'd') + +add_project_arguments([ + '-dip25', + '-dip1000', + ], language: 'd') + mir_algorithm_dir = include_directories('source/', 'include/') @@ -89,4 +101,6 @@ if get_option('with_test') test(meson.project_name() + '-test', mir_algorithm_test_exe) + subdir('cpp_example') + endif From 11aecad0d894b6e3de2c15841a2121ed4f22f9af Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 21:39:24 +0700 Subject: [PATCH 03/17] ditto --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index e519f5a1..c045cbad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,14 @@ language: d sudo: required +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-7 + env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + packages: - pkg-config d: From 25d1a9d85170c3b30a4761613c98d22b17e36660 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 21:45:32 +0700 Subject: [PATCH 04/17] ditto --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c045cbad..6547b792 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,8 @@ addons: - ubuntu-toolchain-r-test packages: - g++-7 - env: - - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" +env: + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" packages: - pkg-config From 204ca8e485ffaea38c4ae4706e25c215c872a77b Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 22:15:29 +0700 Subject: [PATCH 05/17] ditto --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6547b792..c970dcb7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,6 @@ addons: - ubuntu-toolchain-r-test packages: - g++-7 -env: - - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" - packages: - pkg-config d: @@ -22,6 +19,7 @@ branches: - master env: - ARCH="x86_64" + - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" matrix: include: - {os: linux, d: ldc-beta, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} From 4f51f39fa647c9c292ef1333e73eb3fbaa3937a3 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 22:30:37 +0700 Subject: [PATCH 06/17] ditto --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index c970dcb7..15ea3ec8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,14 +18,14 @@ branches: only: - master env: - - ARCH="x86_64" - - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - CC="gcc-7" CXX="g++-7" ARCH="x86_64" + matrix: include: - - {os: linux, d: ldc-beta, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: ldc, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: dmd-beta, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: dmd, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} + - {os: linux, d: ldc-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} + - {os: linux, d: ldc, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} + - {os: linux, d: dmd-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} + - {os: linux, d: dmd, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} allow_failures: - {d: dmd-nightly} - {d: ldc-beta} From 24d78e827ff46fba94c46819d592197442f537c9 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 23:03:06 +0700 Subject: [PATCH 07/17] ditto --- cpp_example/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp_example/meson.build b/cpp_example/meson.build index c40029e8..519c83e3 100644 --- a/cpp_example/meson.build +++ b/cpp_example/meson.build @@ -4,4 +4,4 @@ mir_algorithm_cpp_test_exe = executable(meson.project_name() + '-test', dependencies: mir_algorithm_dep, ) -test(meson.project_name() + '-test', mir_algorithm_cpp_test_exe) +test(meson.project_name() + '-cpp-test', mir_algorithm_cpp_test_exe) From 54f51d8f0711fc9dc98a61d4141ccb005410acd7 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Mon, 19 Nov 2018 23:17:17 +0700 Subject: [PATCH 08/17] ditto --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 15ea3ec8..121ab0eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ addons: - ubuntu-toolchain-r-test packages: - g++-7 + - gcc-7-multilib packages: - pkg-config d: @@ -22,10 +23,10 @@ env: matrix: include: - - {os: linux, d: ldc-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: ldc, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: dmd-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} - - {os: linux, d: dmd, env: CC="gcc-7" CXX="g++-7" ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}} + - {os: linux, d: ldc-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} + - {os: linux, d: ldc, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} + - {os: linux, d: dmd-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} + - {os: linux, d: dmd, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} allow_failures: - {d: dmd-nightly} - {d: ldc-beta} From 0c94ecab38579956c5afdad51962dc9cf03867c7 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 00:14:15 +0700 Subject: [PATCH 09/17] re --- cpp_example/main.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index 6914b277..66df0433 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -19,18 +19,18 @@ int main() // test rcarray constructors and destructors - mir_rcarray a(3); - Space::initWithIota(a); - auto b = a; - auto c = b.asSlice(); - auto d = c; - Space::reverseRcSlice(d); - auto e = a.asSlice(); + // mir_rcarray a(3); + // Space::initWithIota(a); + // auto b = a; + // auto c = b.asSlice(); + // auto d = c; + // Space::reverseRcSlice(d); + // auto e = a.asSlice(); - printf("%f %f %f", - e._iterator._iterator[0], - e._iterator._iterator[1], - e._iterator._iterator[2]); + // printf("%f %f %f", + // e._iterator._iterator[0], + // e._iterator._iterator[1], + // e._iterator._iterator[2]); return 0; } From bcb532841d3666aa655f361e31c6ce16d172c252 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 11:13:50 +0700 Subject: [PATCH 10/17] debug commit --- .travis.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 121ab0eb..586aca1d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,11 @@ addons: apt: sources: - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 packages: - g++-7 - gcc-7-multilib + - clang-5.0 packages: - pkg-config d: @@ -19,14 +21,14 @@ branches: only: - master env: - - CC="gcc-7" CXX="g++-7" ARCH="x86_64" + - CC="clang-5.0" CXX="clang++-5.0" ARCH="x86_64" matrix: include: - - {os: linux, d: ldc-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} - - {os: linux, d: ldc, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} - - {os: linux, d: dmd-beta, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} - - {os: linux, d: dmd, env: CC="gcc-7" CXX="g++-7" ARCH="x86"} + - {os: linux, d: ldc-beta, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"} + - {os: linux, d: ldc, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"} + - {os: linux, d: dmd-beta, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"} + - {os: linux, d: dmd, env: CC="clang-5.0" CXX="clang++-5.0" ARCH="x86"} allow_failures: - {d: dmd-nightly} - {d: ldc-beta} From e52372c568fa217642144adfecbe8feed688f168 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 11:29:34 +0700 Subject: [PATCH 11/17] ditto --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 586aca1d..542dd930 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ script: - travis_wait 100 dub test --arch "$ARCH" --build=unittest-cov - travis_wait 100 dub test --arch "$ARCH" -c dips - ./test_examples.sh - - meson build -D with_test=true && cd build && ninja -j4 && ninja -j4 test -v && cd .. # TODO: 32bit meson test + - meson build -D with_test=true --default-library=static && cd build && ninja -j4 && ninja -j4 test -v && cd .. # TODO: 32bit meson test # - travis_wait 100 dub test --arch "$ARCH" --build=unittest-release after_success: From 86d2d4c27ad4a7abd3c17b27732c7d11bf105481 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 15:10:22 +0700 Subject: [PATCH 12/17] ditto --- .travis.yml | 2 -- cpp_example/main.cpp | 22 +++++++++++----------- include/mir/ndslice.h | 9 +++++++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 542dd930..667bce31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,8 @@ sudo: required addons: apt: sources: - - ubuntu-toolchain-r-test - llvm-toolchain-trusty-5.0 packages: - - g++-7 - gcc-7-multilib - clang-5.0 packages: diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index 66df0433..6914b277 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -19,18 +19,18 @@ int main() // test rcarray constructors and destructors - // mir_rcarray a(3); - // Space::initWithIota(a); - // auto b = a; - // auto c = b.asSlice(); - // auto d = c; - // Space::reverseRcSlice(d); - // auto e = a.asSlice(); + mir_rcarray a(3); + Space::initWithIota(a); + auto b = a; + auto c = b.asSlice(); + auto d = c; + Space::reverseRcSlice(d); + auto e = a.asSlice(); - // printf("%f %f %f", - // e._iterator._iterator[0], - // e._iterator._iterator[1], - // e._iterator._iterator[2]); + printf("%f %f %f", + e._iterator._iterator[0], + e._iterator._iterator[1], + e._iterator._iterator[2]); return 0; } diff --git a/include/mir/ndslice.h b/include/mir/ndslice.h index 64520d30..cab5721a 100644 --- a/include/mir/ndslice.h +++ b/include/mir/ndslice.h @@ -20,8 +20,13 @@ Authors: Ilya Yaroshenko #define mir_size_t unsigned int #define mir_ptrdiff_t int #elif INTPTR_MAX == INT64_MAX - #define mir_size_t unsigned long - #define mir_ptrdiff_t long + #ifdef _WIN32 + #define mir_size_t unsigned long + #define mir_ptrdiff_t long + #else + #define mir_size_t unsigned long long + #define mir_ptrdiff_t long long + #endif #else #error "Environment not 32 or 64-bit." #endif From f2a3ab46ee4559b2d70e3cdcf879889dc2f78741 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 15:15:02 +0700 Subject: [PATCH 13/17] ditto --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 667bce31..0c74f938 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ sudo: required addons: apt: sources: + - ubuntu-toolchain-r-test - llvm-toolchain-trusty-5.0 packages: - gcc-7-multilib From 570dd03e60f9b0dd5a684e65ae0eadf8cdfd8472 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 15:32:19 +0700 Subject: [PATCH 14/17] ditto --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0c74f938..542dd930 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ addons: - ubuntu-toolchain-r-test - llvm-toolchain-trusty-5.0 packages: + - g++-7 - gcc-7-multilib - clang-5.0 packages: From dd12528bb058bb484a9546f8d01a0f1806e4617b Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 15:49:40 +0700 Subject: [PATCH 15/17] ditto --- include/mir/ndslice.h | 6 ++--- include/mir/rcarray.h | 55 +++++++++++++++++++++++++++++++++++++++++++ subprojects/mir-core | 1 + 3 files changed, 59 insertions(+), 3 deletions(-) create mode 160000 subprojects/mir-core diff --git a/include/mir/ndslice.h b/include/mir/ndslice.h index cab5721a..bbe3a3d1 100644 --- a/include/mir/ndslice.h +++ b/include/mir/ndslice.h @@ -21,11 +21,11 @@ Authors: Ilya Yaroshenko #define mir_ptrdiff_t int #elif INTPTR_MAX == INT64_MAX #ifdef _WIN32 - #define mir_size_t unsigned long - #define mir_ptrdiff_t long - #else #define mir_size_t unsigned long long #define mir_ptrdiff_t long long + #else + #define mir_size_t unsigned long + #define mir_ptrdiff_t long #endif #else #error "Environment not 32 or 64-bit." diff --git a/include/mir/rcarray.h b/include/mir/rcarray.h index 1c8db090..6d56b172 100644 --- a/include/mir/rcarray.h +++ b/include/mir/rcarray.h @@ -2,6 +2,7 @@ #define MIR_RCARRAY +#include #include #include "mir/ndslice.h" @@ -30,6 +31,60 @@ struct mir_rcarray throw std::runtime_error("mir_rcarray: out of memory arror."); } } + + size_t size() noexcept + { + return _context ? *(size_t*)(_context + sizeof(void*)) : 0; + } + + T& at(size_t index) + { + assert(index < this->size()); + return ((T*)(_context + sizeof(void*) * 4))[index]; + } + + const T& at(size_t index) const + { + assert(index < this->size()); + return ((const T*)(_context + sizeof(void*) * 4))[index]; + } + + T& operator[](size_t index) + { + assert(index < this->size()); + return ((T*)(_context + sizeof(void*) * 4))[index]; + } + + const T& operator[](size_t index) const + { + assert(index < this->size()); + return ((const T*)(_context + sizeof(void*) * 4))[index]; + } + + T* data() noexcept + { + return _context ? (T*)(_context + sizeof(void*) * 4) : NULL; + } + + T* begin() noexcept + { + return _context ? (T*)(_context + sizeof(void*) * 4) : NULL; + } + + const T* cbegin() const noexcept + { + return _context ? (const T*)(_context + sizeof(void*) * 4) : NULL; + } + + T* end() noexcept + { + return this->begin() + this->size(); + } + + const T* cend() const noexcept + { + return this->cbegin() + this->size(); + } }; diff --git a/subprojects/mir-core b/subprojects/mir-core new file mode 160000 index 00000000..06572e27 --- /dev/null +++ b/subprojects/mir-core @@ -0,0 +1 @@ +Subproject commit 06572e27153c55a9637332de2885aaca1e3d8080 From 83f5df010e0848f424e18d5c3f003c58bc1a5c80 Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 16:02:14 +0700 Subject: [PATCH 16/17] dittop --- cpp_example/main.cpp | 16 +++++++++------- include/mir/rcarray.h | 38 +++++++++++++++++++------------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index 6914b277..ffed3893 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -1,3 +1,4 @@ +#include #include #include #include "mir/rcarray.h" @@ -21,16 +22,17 @@ int main() // test rcarray constructors and destructors mir_rcarray a(3); Space::initWithIota(a); - auto b = a; + auto b = a; // check copy constructor auto c = b.asSlice(); - auto d = c; + auto d = c; // check copy constructor Space::reverseRcSlice(d); - auto e = a.asSlice(); - printf("%f %f %f", - e._iterator._iterator[0], - e._iterator._iterator[1], - e._iterator._iterator[2]); + // reversed 0 1 2 (iota) + assert(a[0] == 2); + assert(a[1] == 1); + assert(a[2] == 0); + + assert(d._iterator._iterator == a.data()); return 0; } diff --git a/include/mir/rcarray.h b/include/mir/rcarray.h index 6d56b172..e169b80d 100644 --- a/include/mir/rcarray.h +++ b/include/mir/rcarray.h @@ -2,7 +2,7 @@ #define MIR_RCARRAY -#include +#include #include #include "mir/ndslice.h" @@ -32,56 +32,56 @@ struct mir_rcarray } } - size_t size() noexcept + inline size_t size() noexcept { - return _context ? *(size_t*)(_context + sizeof(void*)) : 0; + return _context ? *(size_t*)((char*)_context + sizeof(void*)) : 0; } - T& at(size_t index) + inline T& at(size_t index) { assert(index < this->size()); - return ((T*)(_context + sizeof(void*) * 4))[index]; + return ((T*)((char*)_context + sizeof(void*) * 4))[index]; } - const T& at(size_t index) const + inline const T& at(size_t index) const { assert(index < this->size()); - return ((const T*)(_context + sizeof(void*) * 4))[index]; + return ((const T*)((char*)_context + sizeof(void*) * 4))[index]; } - T& operator[](size_t index) + inline T& operator[](size_t index) { assert(index < this->size()); - return ((T*)(_context + sizeof(void*) * 4))[index]; + return ((T*)((char*)_context + sizeof(void*) * 4))[index]; } - const T& operator[](size_t index) const + inline const T& operator[](size_t index) const { assert(index < this->size()); - return ((const T*)(_context + sizeof(void*) * 4))[index]; + return ((const T*)((char*)_context + sizeof(void*) * 4))[index]; } - T* data() noexcept + inline T* data() noexcept { - return _context ? (T*)(_context + sizeof(void*) * 4) : NULL; + return _context ? (T*)((char*)_context + sizeof(void*) * 4) : NULL; } - T* begin() noexcept + inline T* begin() noexcept { - return _context ? (T*)(_context + sizeof(void*) * 4) : NULL; + return _context ? (T*)((char*)_context + sizeof(void*) * 4) : NULL; } - const T* cbegin() const noexcept + inline const T* cbegin() const noexcept { - return _context ? (const T*)(_context + sizeof(void*) * 4) : NULL; + return _context ? (const T*)((char*)_context + sizeof(void*) * 4) : NULL; } - T* end() noexcept + inline T* end() noexcept { return this->begin() + this->size(); } - const T* cend() const noexcept + inline const T* cend() const noexcept { return this->cbegin() + this->size(); } From 8a7624838717db5df199fb9258d318ff7aac047d Mon Sep 17 00:00:00 2001 From: Ilya Yaroshenko Date: Tue, 20 Nov 2018 16:13:51 +0700 Subject: [PATCH 17/17] ditto --- cpp_example/main.cpp | 8 +++++--- include/mir/rcarray.h | 4 ++-- subprojects/mir-core | 1 - 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 160000 subprojects/mir-core diff --git a/cpp_example/main.cpp b/cpp_example/main.cpp index ffed3893..cc5a1c89 100644 --- a/cpp_example/main.cpp +++ b/cpp_example/main.cpp @@ -20,12 +20,14 @@ int main() // test rcarray constructors and destructors - mir_rcarray a(3); - Space::initWithIota(a); + mir_rcarray a(3); // [NaN, NaN, NaN] + assert(a.size() == 3); + + Space::initWithIota(a); //[0, 1, 2] auto b = a; // check copy constructor auto c = b.asSlice(); auto d = c; // check copy constructor - Space::reverseRcSlice(d); + Space::reverseRcSlice(d); //[2, 1, 0] // reversed 0 1 2 (iota) assert(a[0] == 2); diff --git a/include/mir/rcarray.h b/include/mir/rcarray.h index e169b80d..23a04327 100644 --- a/include/mir/rcarray.h +++ b/include/mir/rcarray.h @@ -91,11 +91,11 @@ struct mir_rcarray template struct mir_rci { +public: + T* _iterator; mir_rcarray _array; -public: - ~mir_rci() = default; mir_rci(mir_rci& rhs) = default; }; diff --git a/subprojects/mir-core b/subprojects/mir-core deleted file mode 160000 index 06572e27..00000000 --- a/subprojects/mir-core +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 06572e27153c55a9637332de2885aaca1e3d8080