diff --git a/README.md b/README.md index 993d189..c085b3c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![license](https://img.shields.io/github/license/Lyncs-API/lyncs.cppyy?logo=github&logoColor=white)](https://github.com/Lyncs-API/lyncs.cppyy/blob/master/LICENSE) [![build & test](https://img.shields.io/github/workflow/status/Lyncs-API/lyncs.cppyy/build%20&%20test?logo=github&logoColor=white)](https://github.com/Lyncs-API/lyncs.cppyy/actions) [![codecov](https://img.shields.io/codecov/c/github/Lyncs-API/lyncs.cppyy?logo=codecov&logoColor=white)](https://codecov.io/gh/Lyncs-API/lyncs.cppyy) -[![pylint](https://img.shields.io/badge/pylint%20score-9.4%2F10-green?logo=python&logoColor=white)](http://pylint.pycqa.org/) +[![pylint](https://img.shields.io/badge/pylint%20score-9.3%2F10-green?logo=python&logoColor=white)](http://pylint.pycqa.org/) [![black](https://img.shields.io/badge/code%20style-black-000000.svg?logo=codefactor&logoColor=white)](https://github.com/ambv/black) diff --git a/lyncs_cppyy/__init__.py b/lyncs_cppyy/__init__.py index b1b4b99..98ff3ca 100644 --- a/lyncs_cppyy/__init__.py +++ b/lyncs_cppyy/__init__.py @@ -5,7 +5,7 @@ [cppyy](https://cppyy.readthedocs.io/en/latest/) in the Lyncs API. """ -__version__ = "0.2.0" +__version__ = "0.2.1" from cppyy import nullptr, cppdef, gbl, include, c_include, set_debug from .lib import * diff --git a/lyncs_cppyy/lib.py b/lyncs_cppyy/lib.py index 62654d5..24e93a4 100644 --- a/lyncs_cppyy/lib.py +++ b/lyncs_cppyy/lib.py @@ -227,6 +227,22 @@ def undef(self): if cpp: cppyy.cppdef(cpp) + def get_namespace(self, namespace): + "Returns a view of the library at a given namespace" + parts = namespace.replace("::", ".").split(".") + out = cppyy.gbl + for part in parts: + out = getattr(out, part) + return out + + def namespace_loop(self): + "Loops over all the given namespace" + for namespace in self.namespace: + try: + yield self.get_namespace(namespace) + except AttributeError: + pass + def __getattr__(self, key): if not self.loaded: self.load() @@ -235,9 +251,9 @@ def __getattr__(self, key): if self.defined: key = self.defined.get(key, key) if self.namespace: - for namespace in self.namespace: + for namespace in self.namespace_loop(): try: - return getattr(getattr(cppyy.gbl, namespace), key) + return getattr(namespace, key) except AttributeError: pass return getattr(cppyy.gbl, key) @@ -260,10 +276,10 @@ def __setattr__(self, key, value): if self.defined: key = self.defined.get(key, key) if self.namespace: - for namespace in self.namespace: + for namespace in self.namespace_loop(): try: - getattr(getattr(cppyy.gbl, namespace), key) - return setattr(getattr(cppyy.gbl, namespace), key, value) + getattr(namespace, key) + return setattr(namespace, key, value) except AttributeError: pass getattr(cppyy.gbl, key) diff --git a/lyncs_cppyy/ll.py b/lyncs_cppyy/ll.py index 09448ae..77b0ae4 100644 --- a/lyncs_cppyy/ll.py +++ b/lyncs_cppyy/ll.py @@ -37,7 +37,7 @@ def __cppyy__(self): def to_pointer(ptr: int, ctype: str = "void *", size: int = None): "Casts integer to void pointer" - ptr = cast[ctype](ptr) + ptr = reinterpret_cast[ctype](ptr) if size is not None: ptr.reshape((size,)) return ptr diff --git a/lyncs_cppyy/numpy.py b/lyncs_cppyy/numpy.py index 4148585..9914637 100644 --- a/lyncs_cppyy/numpy.py +++ b/lyncs_cppyy/numpy.py @@ -10,9 +10,10 @@ from .ll import to_pointer from .lib import lib +# NOTE: commented out cases that are not working dtype_map = ( (np.bool_, "bool"), - (np.byte, "signed char"), + # (np.byte, "signed char"), (np.ubyte, "unsigned char"), (np.short, "short"), (np.ushort, "unsigned short"), @@ -22,14 +23,14 @@ (np.uint, "unsigned long"), (np.longlong, "long long"), (np.ulonglong, "unsigned long long"), - (np.half, ""), + # (np.half, ""), (np.single, "float"), (np.double, "double"), (np.longdouble, "long double"), - (np.csingle, "float complex"), - (np.cdouble, "double complex"), - (np.clongdouble, "long double complex"), - (np.int8, "int8_t"), + (np.csingle, "std::complex"), + (np.cdouble, "std::complex"), + # (np.clongdouble, "std::complex"), + # (np.int8, "int8_t"), (np.int16, "int16_t"), (np.int32, "int32_t"), (np.int64, "int64_t"), @@ -41,8 +42,8 @@ (np.uintp, "uintptr_t"), (np.float32, "float"), (np.float64, "double"), - (np.complex64, "float complex"), - (np.complex128, "double complex"), + (np.complex64, "std::complex"), + (np.complex128, "std::complex"), ) char_map = {dtype(0).dtype.char: ctype for dtype, ctype in dtype_map} diff --git a/test/cnumbers/numbers.hpp b/test/cnumbers/numbers.hpp index 52ef3a1..6a083c4 100644 --- a/test/cnumbers/numbers.hpp +++ b/test/cnumbers/numbers.hpp @@ -16,4 +16,11 @@ namespace numbers { T global() { return (T) gbl; } + + namespace another { + template + T two() { + return (T) 2; + } + } } diff --git a/test/test_lib.py b/test/test_lib.py index edf6723..d62aaa9 100644 --- a/test/test_lib.py +++ b/test/test_lib.py @@ -67,7 +67,7 @@ def test_cnumbers(): cppnumbers = Lib( header="numbers.hpp", path=path, - namespace="numbers", + namespace=["numbers", "numbers.another"], include=path + "/include", # Not needed library=Lib(), # Not needed defined={"uno": "one", "GBL": "gbl"}, @@ -76,6 +76,7 @@ def test_cnumbers(): assert cppnumbers.zero["int"]() == 0 assert cppnumbers.one["long"]() == 1 assert cppnumbers.uno["long"]() == 1 + assert cppnumbers.two["int"]() == 2 assert cppnumbers.ONE == 1 diff --git a/test/test_numpy.py b/test/test_numpy.py index 011d153..1a9898e 100644 --- a/test/test_numpy.py +++ b/test/test_numpy.py @@ -1,6 +1,19 @@ import numpy from lyncs_cppyy import ll, cppdef, include, gbl, lib -from lyncs_cppyy.numpy import array_to_pointers +from lyncs_cppyy.numpy import dtype_map, char_map +from lyncs_cppyy.numpy import * + + +def test_get_ctype(): + for dtype, ctype in char_map.items(): + assert get_ctype(dtype) == ctype + + +def test_get_numpy_pointer(): + for dtype in char_map: + print(dtype) + arr = numpy.zeros((10,), dtype=dtype) + assert (numpy.array(get_numpy_pointer(arr)) == arr).all() def test_flatten_array_to_pointers():