This is an automated email from the ASF dual-hosted git repository.

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 510acf2a refactor: Separate components into folders under 
src/nanoarrow (#536)
510acf2a is described below

commit 510acf2a3a60fcca29d98afcf03889f1bae55196
Author: Dewey Dunnington <[email protected]>
AuthorDate: Mon Jun 24 23:18:26 2024 +0000

    refactor: Separate components into folders under src/nanoarrow (#536)
    
    The number of files in src/nanoarrow had accumulated quite a bit, which
    wasn't exactly a problem, but the files did have confusingly verbose
    names for historical reasons (mostly that the IPC and Device libraries
    originated elsewhere). This PR moves the `nanoarrow` target sources to
    `src/nanoarrow/common`, the `nanoarrow_ipc` target sources to
    `src/nanoarrow/ipc`, the `nanoarrow_device` target sources to
    `src/nanoarrow/device`, and the tests for the testing helpers to
    `src/nanoarrow/testing` (in the future this will/should be a
    `nanoarrow_testing` target).
    
    I did leave the user-facing headers in src/nanoarrow, which makes a
    slightly cleaner transition between the "bundled" and CMake/Meson
    subproject builds (i.e., one always just does `#include
    "nanoarrow/nanoarrow.h"`)
---
 .pre-commit-config.yaml                            |  5 +-
 CMakeLists.txt                                     | 77 ++++++++++----------
 ci/scripts/bundle.py                               | 30 ++++----
 dev/release/rat_exclude_files.txt                  |  2 +-
 meson.build                                        | 54 ++++++++------
 python/tests/test_array_stream.py                  |  2 +-
 python/tests/test_ipc.py                           |  2 +-
 src/nanoarrow/{ => common}/array.c                 |  0
 src/nanoarrow/{ => common}/array_stream.c          |  0
 src/nanoarrow/{ => common}/array_stream_test.cc    |  0
 src/nanoarrow/{ => common}/array_test.cc           |  0
 src/nanoarrow/{ => common}/buffer_test.cc          |  0
 .../{array_inline.h => common/inline_array.h}      |  4 +-
 .../{buffer_inline.h => common/inline_buffer.h}    |  2 +-
 .../{nanoarrow_types.h => common/inline_types.h}   |  0
 src/nanoarrow/{ => common}/nanoarrow_hpp_test.cc   |  0
 src/nanoarrow/{ => common}/schema.c                |  0
 src/nanoarrow/{ => common}/schema_test.cc          |  0
 src/nanoarrow/{ => common}/utils.c                 |  0
 src/nanoarrow/{ => common}/utils_test.cc           |  0
 .../{nanoarrow_device_cuda.c => device/cuda.c}     |  0
 .../cuda_test.cc}                                  |  0
 .../{nanoarrow_device.c => device/device.c}        | 45 +++++++++---
 .../device_hpp_test.cc}                            |  0
 .../device_test.cc}                                |  0
 .../{nanoarrow_device_metal.cc => device/metal.cc} | 17 +++--
 .../metal_test.cc}                                 |  7 +-
 .../{nanoarrow_ipc_decoder.c => ipc/decoder.c}     |  2 +-
 .../decoder_test.cc}                               |  2 +-
 .../files_test.cc}                                 |  6 +-
 .../flatcc_generated.h}                            |  0
 .../ipc_hpp_test.cc}                               |  2 +-
 .../{nanoarrow_ipc_reader.c => ipc/reader.c}       |  0
 .../reader_test.cc}                                |  2 +-
 src/nanoarrow/nanoarrow.h                          |  6 +-
 src/nanoarrow/nanoarrow_device.h                   | 67 +++++++++++++++++
 src/nanoarrow/nanoarrow_device_cuda.h              | 52 -------------
 src/nanoarrow/nanoarrow_device_metal.h             | 85 ----------------------
 .../testing_test.cc}                               |  0
 39 files changed, 215 insertions(+), 256 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ca9c4806..c328042f 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -35,7 +35,7 @@ repos:
       - id: clang-format
         args: [-i]
         types_or: [c, c++]
-        exclude: "(^thirdparty/.*$)|(nanoarrow_ipc_flatcc_generated.h)"
+        exclude: "(^thirdparty/.*$)|(flatcc_generated.h)"
   - repo: https://github.com/cheshirekow/cmake-format-precommit
     rev: v0.6.13
     hooks:
@@ -66,7 +66,6 @@ repos:
         exclude: |
             (?x)
             ^thirdparty
-            |nanoarrow_ipc_flatcc_generated.h
-            |nanoarrow_device_metal.cc
+            |flatcc_generated.h
 
 exclude: "^dist"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8b202c28..6efbfa65 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -115,20 +115,22 @@ else()
   set(NANOARROW_BUILD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
 endif()
 
-# Start the list of targets and headers to install
-set(NANOARROW_INSTALL_TARGETS nanoarrow)
+# Start the list of headers to install
 set(NANOARROW_INSTALL_HEADERS 
${NANOARROW_BUILD_INCLUDE_DIR}/nanoarrow/nanoarrow.h
                               
${NANOARROW_BUILD_INCLUDE_DIR}/nanoarrow/nanoarrow.hpp)
 
-# If the bundler didn't already assign the source files for the library, do so 
here
+# If the bundler didn't already assign the source files for the library, do so 
here.
+# Also handle install() arguments that are different between the bundled and 
not
+# bundled version.
 if(NOT NANOARROW_BUNDLE)
-  set(NANOARROW_BUILD_SOURCES src/nanoarrow/array.c src/nanoarrow/schema.c
-                              src/nanoarrow/array_stream.c 
src/nanoarrow/utils.c)
-  list(APPEND
-       NANOARROW_INSTALL_HEADERS
-       src/nanoarrow/array_inline.h
-       src/nanoarrow/buffer_inline.h
-       src/nanoarrow/nanoarrow_types.h
+  set(NANOARROW_BUILD_SOURCES
+      src/nanoarrow/common/array.c src/nanoarrow/common/schema.c
+      src/nanoarrow/common/array_stream.c src/nanoarrow/common/utils.c)
+
+  install(FILES src/nanoarrow/common/inline_array.h 
src/nanoarrow/common/inline_buffer.h
+                src/nanoarrow/common/inline_types.h DESTINATION 
include/nanoarrow/common)
+
+  list(APPEND NANOARROW_INSTALL_HEADERS
        "${CMAKE_CURRENT_BINARY_DIR}/src/nanoarrow/nanoarrow_config.h")
 endif()
 
@@ -142,6 +144,13 @@ target_include_directories(nanoarrow
                                   $<INSTALL_INTERFACE:include>)
 target_compile_definitions(nanoarrow PUBLIC 
"$<$<CONFIG:Debug>:NANOARROW_DEBUG>")
 
+# Ensure targets/headers can be installed
+install(TARGETS nanoarrow
+        DESTINATION lib
+        EXPORT nanoarrow-exports)
+
+install(FILES ${NANOARROW_INSTALL_HEADERS} DESTINATION include/nanoarrow)
+
 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
   if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
     target_compile_options(nanoarrow
@@ -214,8 +223,8 @@ if(NANOARROW_IPC)
   endif()
 
   if(NOT NANOARROW_BUNDLE)
-    set(NANOARROW_IPC_BUILD_SOURCES src/nanoarrow/nanoarrow_ipc_decoder.c
-                                    src/nanoarrow/nanoarrow_ipc_reader.c)
+    set(NANOARROW_IPC_BUILD_SOURCES src/nanoarrow/ipc/decoder.c
+                                    src/nanoarrow/ipc/reader.c)
   endif()
 
   add_library(nanoarrow_ipc ${NANOARROW_IPC_BUILD_SOURCES})
@@ -260,7 +269,7 @@ if(NANOARROW_DEVICE)
     find_library(QUARTZ_CORE_LIBRARY QuartzCore REQUIRED)
     message(STATUS "CoreFoundation framework found at 
'${QUARTZ_CORE_LIBRARY}'")
 
-    set(NANOARROW_DEVICE_SOURCES_METAL src/nanoarrow/nanoarrow_device_metal.cc)
+    set(NANOARROW_DEVICE_SOURCES_METAL src/nanoarrow/device/metal.cc)
     set(NANOARROW_DEVICE_INCLUDE_METAL ${CMAKE_BINARY_DIR}/metal-cpp)
     set(NANOARROW_DEVICE_LIBS_METAL ${METAL_LIBRARY} ${FOUNDATION_LIBRARY}
                                     ${QUARTZ_CORE_LIBRARY})
@@ -269,14 +278,14 @@ if(NANOARROW_DEVICE)
 
   if(NANOARROW_DEVICE_WITH_CUDA)
     find_package(CUDAToolkit REQUIRED)
-    set(NANOARROW_DEVICE_SOURCES_CUDA src/nanoarrow/nanoarrow_device_cuda.c)
+    set(NANOARROW_DEVICE_SOURCES_CUDA src/nanoarrow/device/cuda.c)
     set(NANOARROW_DEVICE_LIBS_CUDA CUDA::cuda_driver)
     set(NANOARROW_DEVICE_DEFS_CUDA "NANOARROW_DEVICE_WITH_CUDA")
   endif()
 
   # If the bundler didn't already assign the source files for the library, do 
so here
   if(NOT NANOARROW_BUNDLE)
-    set(NANOARROW_DEVICE_BUILD_SOURCES src/nanoarrow/nanoarrow_device.c)
+    set(NANOARROW_DEVICE_BUILD_SOURCES src/nanoarrow/device/device.c)
   endif()
 
   add_library(nanoarrow_device
@@ -343,13 +352,13 @@ if(NANOARROW_BUILD_TESTS)
   add_subdirectory("thirdparty/googletest")
 
   # Be sure to keep these tests in sync with src/nanoarrow/meson.build
-  add_executable(utils_test src/nanoarrow/utils_test.cc)
-  add_executable(buffer_test src/nanoarrow/buffer_test.cc)
-  add_executable(array_test src/nanoarrow/array_test.cc)
-  add_executable(schema_test src/nanoarrow/schema_test.cc)
-  add_executable(array_stream_test src/nanoarrow/array_stream_test.cc)
-  add_executable(nanoarrow_hpp_test src/nanoarrow/nanoarrow_hpp_test.cc)
-  add_executable(nanoarrow_testing_test 
src/nanoarrow/nanoarrow_testing_test.cc)
+  add_executable(utils_test src/nanoarrow/common/utils_test.cc)
+  add_executable(buffer_test src/nanoarrow/common/buffer_test.cc)
+  add_executable(array_test src/nanoarrow/common/array_test.cc)
+  add_executable(schema_test src/nanoarrow/common/schema_test.cc)
+  add_executable(array_stream_test src/nanoarrow/common/array_stream_test.cc)
+  add_executable(nanoarrow_hpp_test src/nanoarrow/common/nanoarrow_hpp_test.cc)
+  add_executable(nanoarrow_testing_test src/nanoarrow/testing/testing_test.cc)
   add_executable(c_data_integration_test
                  src/nanoarrow/integration/c_data_integration_test.cc)
 
@@ -409,10 +418,10 @@ if(NANOARROW_BUILD_TESTS)
 
     enable_testing()
 
-    add_executable(nanoarrow_ipc_decoder_test 
src/nanoarrow/nanoarrow_ipc_decoder_test.cc)
-    add_executable(nanoarrow_ipc_reader_test 
src/nanoarrow/nanoarrow_ipc_reader_test.cc)
-    add_executable(nanoarrow_ipc_files_test 
src/nanoarrow/nanoarrow_ipc_files_test.cc)
-    add_executable(nanoarrow_ipc_hpp_test 
src/nanoarrow/nanoarrow_ipc_hpp_test.cc)
+    add_executable(nanoarrow_ipc_decoder_test 
src/nanoarrow/ipc/decoder_test.cc)
+    add_executable(nanoarrow_ipc_reader_test src/nanoarrow/ipc/reader_test.cc)
+    add_executable(nanoarrow_ipc_files_test src/nanoarrow/ipc/files_test.cc)
+    add_executable(nanoarrow_ipc_hpp_test src/nanoarrow/ipc/ipc_hpp_test.cc)
 
     if(NANOARROW_CODE_COVERAGE)
       target_compile_options(ipc_coverage_config INTERFACE -O0 -g --coverage)
@@ -457,8 +466,8 @@ if(NANOARROW_BUILD_TESTS)
 
   if(NANOARROW_DEVICE)
     enable_testing()
-    add_executable(nanoarrow_device_test 
src/nanoarrow/nanoarrow_device_test.cc)
-    add_executable(nanoarrow_device_hpp_test 
src/nanoarrow/nanoarrow_device_hpp_test.cc)
+    add_executable(nanoarrow_device_test src/nanoarrow/device/device_test.cc)
+    add_executable(nanoarrow_device_hpp_test 
src/nanoarrow/device/device_hpp_test.cc)
 
     if(NANOARROW_DEVICE_CODE_COVERAGE)
       target_compile_options(device_coverage_config INTERFACE -O0 -g 
--coverage)
@@ -482,8 +491,7 @@ if(NANOARROW_BUILD_TESTS)
     gtest_discover_tests(nanoarrow_device_hpp_test)
 
     if(NANOARROW_DEVICE_WITH_METAL)
-      add_executable(nanoarrow_device_metal_test
-                     src/nanoarrow/nanoarrow_device_metal_test.cc)
+      add_executable(nanoarrow_device_metal_test 
src/nanoarrow/device/metal_test.cc)
       target_link_libraries(nanoarrow_device_metal_test
                             nanoarrow_device
                             nanoarrow
@@ -493,8 +501,7 @@ if(NANOARROW_BUILD_TESTS)
     endif()
 
     if(NANOARROW_DEVICE_WITH_CUDA)
-      add_executable(nanoarrow_device_cuda_test
-                     src/nanoarrow/nanoarrow_device_cuda_test.cc)
+      add_executable(nanoarrow_device_cuda_test 
src/nanoarrow/device/cuda_test.cc)
       target_link_libraries(nanoarrow_device_cuda_test
                             nanoarrow_device
                             nanoarrow
@@ -516,12 +523,6 @@ if(NANOARROW_BUILD_BENCHMARKS)
   add_subdirectory(dev/benchmarks)
 endif()
 
-# Ensure targets/headers can be installed
-install(TARGETS ${NANOARROW_INSTALL_TARGETS}
-        DESTINATION lib
-        EXPORT nanoarrow-exports)
-install(FILES ${NANOARROW_INSTALL_HEADERS} DESTINATION include/nanoarrow)
-
 # Generate package files for the build and install trees.
 include(CMakePackageConfigHelpers)
 include(GNUInstallDirs)
diff --git a/ci/scripts/bundle.py b/ci/scripts/bundle.py
index c74512b8..34301494 100644
--- a/ci/scripts/bundle.py
+++ b/ci/scripts/bundle.py
@@ -115,14 +115,14 @@ def bundle_nanoarrow(
     nanoarrow_h = concatenate_content(
         [
             nanoarrow_config_h,
-            src_dir / "nanoarrow_types.h",
+            src_dir / "common" / "inline_types.h",
             src_dir / "nanoarrow.h",
-            src_dir / "buffer_inline.h",
-            src_dir / "array_inline.h",
+            src_dir / "common" / "inline_buffer.h",
+            src_dir / "common" / "inline_array.h",
         ]
     )
 
-    nanoarrow_h = re.sub(r'#include "(nanoarrow/)?[a-z_.]+"', "", nanoarrow_h)
+    nanoarrow_h = re.sub(r'#include "(nanoarrow/)?[a-z_./]+"', "", nanoarrow_h)
     yield f"{output_include_dir}/nanoarrow.h", nanoarrow_h
 
     # Generate files that don't need special handling
@@ -138,10 +138,10 @@ def bundle_nanoarrow(
     # Generate nanoarrow/nanoarrow.c
     nanoarrow_c = concatenate_content(
         [
-            src_dir / "utils.c",
-            src_dir / "schema.c",
-            src_dir / "array.c",
-            src_dir / "array_stream.c",
+            src_dir / "common" / "utils.c",
+            src_dir / "common" / "schema.c",
+            src_dir / "common" / "array.c",
+            src_dir / "common" / "array_stream.c",
         ]
     )
     nanoarrow_c = namespace_nanoarrow_includes(nanoarrow_c, header_namespace)
@@ -171,10 +171,10 @@ def bundle_nanoarrow_device(
         yield f"{output_include_dir}/{filename}", content
 
     # Generate sources
-    for filename in ["nanoarrow_device.c"]:
-        content = read_content(src_dir / filename)
+    for filename in ["device.c"]:
+        content = read_content(src_dir / "device" / filename)
         content = namespace_nanoarrow_includes(content, header_namespace)
-        yield f"{output_source_dir}/{filename}", content
+        yield f"{output_source_dir}/nanoarrow_{filename}", content
 
 
 def bundle_nanoarrow_ipc(
@@ -200,13 +200,13 @@ def bundle_nanoarrow_ipc(
 
     nanoarrow_ipc_c = concatenate_content(
         [
-            src_dir / "nanoarrow_ipc_flatcc_generated.h",
-            src_dir / "nanoarrow_ipc_decoder.c",
-            src_dir / "nanoarrow_ipc_reader.c",
+            src_dir / "ipc" / "flatcc_generated.h",
+            src_dir / "ipc" / "decoder.c",
+            src_dir / "ipc" / "reader.c",
         ]
     )
     nanoarrow_ipc_c = nanoarrow_ipc_c.replace(
-        '#include "nanoarrow/nanoarrow_ipc_flatcc_generated.h"', ""
+        '#include "nanoarrow/ipc/flatcc_generated.h"', ""
     )
     nanoarrow_ipc_c = namespace_nanoarrow_includes(nanoarrow_ipc_c, 
header_namespace)
     yield f"{output_source_dir}/nanoarrow_ipc.c", nanoarrow_ipc_c
diff --git a/dev/release/rat_exclude_files.txt 
b/dev/release/rat_exclude_files.txt
index 6372a56a..cb0a8340 100644
--- a/dev/release/rat_exclude_files.txt
+++ b/dev/release/rat_exclude_files.txt
@@ -12,6 +12,6 @@ r/tests/testthat/_snaps/*.md
 r/cran-comments.md
 dist/flatcc/*
 dist/flatcc.c
-src/nanoarrow/nanoarrow_ipc_flatcc_generated.h
+src/nanoarrow/ipc/flatcc_generated.h
 thirdparty/*
 python/src/nanoarrow/dlpack_abi.h
diff --git a/meson.build b/meson.build
index a057d55b..73c44c5b 100644
--- a/meson.build
+++ b/meson.build
@@ -45,10 +45,10 @@ incdir = include_directories('src/')
 
 nanoarrow_lib = library(
     'nanoarrow',
-    'src/nanoarrow/array.c',
-    'src/nanoarrow/schema.c',
-    'src/nanoarrow/array_stream.c',
-    'src/nanoarrow/utils.c',
+    'src/nanoarrow/common/array.c',
+    'src/nanoarrow/common/schema.c',
+    'src/nanoarrow/common/array_stream.c',
+    'src/nanoarrow/common/utils.c',
     include_directories: [incdir],
     install: true,
 )
@@ -62,8 +62,8 @@ if get_option('ipc')
 
     nanoarrow_ipc_lib = library(
         'nanoarrow_ipc',
-        'src/nanoarrow/nanoarrow_ipc_decoder.c',
-        'src/nanoarrow/nanoarrow_ipc_reader.c',
+        'src/nanoarrow/ipc/decoder.c',
+        'src/nanoarrow/ipc/reader.c',
         dependencies: [nanoarrow_dep, flatcc_dep],
         install: true,
     )
@@ -75,7 +75,7 @@ endif
 needs_device = get_option('device') or get_option('metal') or 
get_option('cuda')
 if needs_device
   device_deps = [nanoarrow_dep]
-  device_srcs = ['src/nanoarrow/nanoarrow_device.c']
+  device_srcs = ['src/nanoarrow/device/device.c']
   device_defines = []
 
   if get_option('metal')
@@ -83,7 +83,7 @@ if needs_device
     metal_cpp_dep = dependency('metal-cpp')
     device_deps += metal_dep
     device_deps += metal_cpp_dep
-    device_srcs += 'src/nanoarrow/nanoarrow_device_metal.cc'
+    device_srcs += 'src/nanoarrow/device/metal.cc'
     device_defines += '-DNANOARROW_DEVICE_WITH_METAL'
   endif
 
@@ -143,15 +143,12 @@ if get_option('tests')
       'nanoarrow-hpp': {
           'deps': [arrow_dep, gtest_dep, gmock_dep, nlohmann_json_dep],
       },
-      'nanoarrow-testing': {
-          'deps': [arrow_dep, gtest_dep, nlohmann_json_dep],
-      },
   }
 
   foreach name, config : nanoarrow_tests
     exc = executable(
         name + '-test',
-        sources: 'src/nanoarrow/' + name.replace('-', '_') + '_test.cc',
+        sources: 'src/nanoarrow/common/' + name.replace('-', '_') + '_test.cc',
         link_with: nanoarrow_lib,
         include_directories: incdir,
         dependencies: config['deps'],
@@ -159,6 +156,12 @@ if get_option('tests')
     test(name, exc)
   endforeach
 
+  testing_test = executable('nanoarrow-testing-test',
+                            'src/nanoarrow/testing/testing_test.cc',
+                            link_with: nanoarrow_lib,
+                            include_directories: incdir,
+                            dependencies: [arrow_dep, gtest_dep, 
nlohmann_json_dep])
+
   c_data_integration_test = executable('c-data-integration-test',
                                        
'src/nanoarrow/integration/c_data_integration_test.cc',
                                        link_with: c_data_integration_lib,
@@ -169,18 +172,21 @@ if get_option('tests')
   if get_option('ipc')
       zlib_dep = dependency('zlib')
       ipc_test_files = {
-          'nanoarrow-ipc-decoder': {
+          'ipc-decoder': {
+              'src': 'decoder',
               'deps': [nanoarrow_ipc_dep, arrow_dep, gtest_dep],
               'timeout': 30,
           },
-          'nanoarrow-ipc-reader': {
+          'ipc-reader': {
+              'src': 'reader',
               'deps': [nanoarrow_ipc_dep, arrow_dep, gtest_dep],
               # the ipc reader test can take longer when executed
               # under valgrind, hence the increased timeout
               'timeout': 90,
 
           },
-          'nanoarrow-ipc-files': {
+          'ipc-files': {
+              'src': 'files',
               'deps': [
                   nanoarrow_ipc_dep,
                   zlib_dep,
@@ -190,7 +196,8 @@ if get_option('tests')
               ],
               'timeout': 30,
           },
-          'nanoarrow-ipc-hpp': {
+          'ipc-hpp': {
+              'src': 'ipc_hpp',
               'deps': [nanoarrow_ipc_dep, gtest_dep],
               'timeout': 30,
           },
@@ -198,19 +205,20 @@ if get_option('tests')
 
       foreach name, config : ipc_test_files
           exc = executable(
-              name + '-test',
-              'src/nanoarrow/' + name.replace('-', '_') + '_test.cc',
-              dependencies: config['deps'])
+              'nanoarrow-' + name + '-test',
+              'src/nanoarrow/ipc/' + config['src'] + '_test.cc',
+              dependencies: config['deps']
+          )
           test(name, exc, timeout: config['timeout'])
       endforeach
   endif
 
   if needs_device
-    device_tests = ['nanoarrow_device', 'nanoarrow_device_hpp']
+    device_tests = ['device', 'device_hpp']
     foreach device_test : device_tests
       exc = executable(
-          device_test.replace('_', '-') + '-test',
-          'src/nanoarrow/' + device_test + '_test.cc',
+          'nanoarrow-' + device_test.replace('_', '-') + '-test',
+          'src/nanoarrow/device/' + device_test + '_test.cc',
           link_with: nanoarrow_device_lib,
           dependencies: [nanoarrow_dep, gtest_dep])
       test(device_test.replace('_', '-'), exc)
@@ -219,7 +227,7 @@ if get_option('tests')
     if get_option('metal')
       exc = executable(
           'nanoarrow-device-metal-test',
-          'src/nanoarrow/nanoarrow_device_metal_test.cc',
+          'src/nanoarrow/device/metal_test.cc',
           link_with: nanoarrow_device_lib,
           dependencies: [nanoarrow_dep, gtest_dep, metal_cpp_dep])
       test('nanoarrow-device-metal', exc)
diff --git a/python/tests/test_array_stream.py 
b/python/tests/test_array_stream.py
index 5ce0b551..57fc170e 100644
--- a/python/tests/test_array_stream.py
+++ b/python/tests/test_array_stream.py
@@ -21,9 +21,9 @@ import pathlib
 import tempfile
 
 import pytest
-from nanoarrow.ipc import Stream
 
 import nanoarrow as na
+from nanoarrow.ipc import Stream
 
 
 def test_array_stream_iter():
diff --git a/python/tests/test_ipc.py b/python/tests/test_ipc.py
index e41db838..28298027 100644
--- a/python/tests/test_ipc.py
+++ b/python/tests/test_ipc.py
@@ -22,9 +22,9 @@ import tempfile
 
 import pytest
 from nanoarrow._utils import NanoarrowException
-from nanoarrow.ipc import Stream
 
 import nanoarrow as na
+from nanoarrow.ipc import Stream
 
 
 def test_ipc_stream_example():
diff --git a/src/nanoarrow/array.c b/src/nanoarrow/common/array.c
similarity index 100%
rename from src/nanoarrow/array.c
rename to src/nanoarrow/common/array.c
diff --git a/src/nanoarrow/array_stream.c b/src/nanoarrow/common/array_stream.c
similarity index 100%
rename from src/nanoarrow/array_stream.c
rename to src/nanoarrow/common/array_stream.c
diff --git a/src/nanoarrow/array_stream_test.cc 
b/src/nanoarrow/common/array_stream_test.cc
similarity index 100%
rename from src/nanoarrow/array_stream_test.cc
rename to src/nanoarrow/common/array_stream_test.cc
diff --git a/src/nanoarrow/array_test.cc b/src/nanoarrow/common/array_test.cc
similarity index 100%
rename from src/nanoarrow/array_test.cc
rename to src/nanoarrow/common/array_test.cc
diff --git a/src/nanoarrow/buffer_test.cc b/src/nanoarrow/common/buffer_test.cc
similarity index 100%
rename from src/nanoarrow/buffer_test.cc
rename to src/nanoarrow/common/buffer_test.cc
diff --git a/src/nanoarrow/array_inline.h b/src/nanoarrow/common/inline_array.h
similarity index 99%
rename from src/nanoarrow/array_inline.h
rename to src/nanoarrow/common/inline_array.h
index 5c734b46..fda778e3 100644
--- a/src/nanoarrow/array_inline.h
+++ b/src/nanoarrow/common/inline_array.h
@@ -24,8 +24,8 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "buffer_inline.h"
-#include "nanoarrow_types.h"
+#include "nanoarrow/common/inline_buffer.h"
+#include "nanoarrow/common/inline_types.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/nanoarrow/buffer_inline.h 
b/src/nanoarrow/common/inline_buffer.h
similarity index 99%
rename from src/nanoarrow/buffer_inline.h
rename to src/nanoarrow/common/inline_buffer.h
index 4de8fa72..261cc865 100644
--- a/src/nanoarrow/buffer_inline.h
+++ b/src/nanoarrow/common/inline_buffer.h
@@ -22,7 +22,7 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "nanoarrow_types.h"
+#include "nanoarrow/common/inline_types.h"
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/nanoarrow/nanoarrow_types.h 
b/src/nanoarrow/common/inline_types.h
similarity index 100%
rename from src/nanoarrow/nanoarrow_types.h
rename to src/nanoarrow/common/inline_types.h
diff --git a/src/nanoarrow/nanoarrow_hpp_test.cc 
b/src/nanoarrow/common/nanoarrow_hpp_test.cc
similarity index 100%
rename from src/nanoarrow/nanoarrow_hpp_test.cc
rename to src/nanoarrow/common/nanoarrow_hpp_test.cc
diff --git a/src/nanoarrow/schema.c b/src/nanoarrow/common/schema.c
similarity index 100%
rename from src/nanoarrow/schema.c
rename to src/nanoarrow/common/schema.c
diff --git a/src/nanoarrow/schema_test.cc b/src/nanoarrow/common/schema_test.cc
similarity index 100%
rename from src/nanoarrow/schema_test.cc
rename to src/nanoarrow/common/schema_test.cc
diff --git a/src/nanoarrow/utils.c b/src/nanoarrow/common/utils.c
similarity index 100%
rename from src/nanoarrow/utils.c
rename to src/nanoarrow/common/utils.c
diff --git a/src/nanoarrow/utils_test.cc b/src/nanoarrow/common/utils_test.cc
similarity index 100%
rename from src/nanoarrow/utils_test.cc
rename to src/nanoarrow/common/utils_test.cc
diff --git a/src/nanoarrow/nanoarrow_device_cuda.c b/src/nanoarrow/device/cuda.c
similarity index 100%
rename from src/nanoarrow/nanoarrow_device_cuda.c
rename to src/nanoarrow/device/cuda.c
diff --git a/src/nanoarrow/nanoarrow_device_cuda_test.cc 
b/src/nanoarrow/device/cuda_test.cc
similarity index 100%
rename from src/nanoarrow/nanoarrow_device_cuda_test.cc
rename to src/nanoarrow/device/cuda_test.cc
diff --git a/src/nanoarrow/nanoarrow_device.c b/src/nanoarrow/device/device.c
similarity index 95%
rename from src/nanoarrow/nanoarrow_device.c
rename to src/nanoarrow/device/device.c
index e5a3e624..14b57b5d 100644
--- a/src/nanoarrow/nanoarrow_device.c
+++ b/src/nanoarrow/device/device.c
@@ -126,33 +126,21 @@ void ArrowDeviceInitCpu(struct ArrowDevice* device) {
   device->private_data = NULL;
 }
 
-#ifdef NANOARROW_DEVICE_WITH_METAL
-struct ArrowDevice* ArrowDeviceMetalDefaultDevice(void);
-#endif
-
-#ifdef NANOARROW_DEVICE_WITH_CUDA
-struct ArrowDevice* ArrowDeviceCuda(ArrowDeviceType device_type, int64_t 
device_id);
-#endif
-
 struct ArrowDevice* ArrowDeviceResolve(ArrowDeviceType device_type, int64_t 
device_id) {
   if (device_type == ARROW_DEVICE_CPU) {
     return ArrowDeviceCpu();
   }
 
-#ifdef NANOARROW_DEVICE_WITH_METAL
   if (device_type == ARROW_DEVICE_METAL) {
     struct ArrowDevice* default_device = ArrowDeviceMetalDefaultDevice();
     if (device_id == default_device->device_id) {
       return default_device;
     }
   }
-#endif
 
-#ifdef NANOARROW_DEVICE_WITH_CUDA
   if (device_type == ARROW_DEVICE_CUDA || device_type == 
ARROW_DEVICE_CUDA_HOST) {
     return ArrowDeviceCuda(device_type, device_id);
   }
-#endif
 
   return NULL;
 }
@@ -495,3 +483,36 @@ ArrowErrorCode ArrowDeviceArrayMoveToDevice(struct 
ArrowDeviceArray* src,
 
   return NANOARROW_OK;
 }
+
+#if !defined(NANOARROW_DEVICE_WITH_CUDA)
+struct ArrowDevice* ArrowDeviceCuda(ArrowDeviceType device_type, int64_t 
device_id) {
+  NANOARROW_UNUSED(device_type);
+  NANOARROW_UNUSED(device_id);
+
+  return NULL;
+}
+#endif
+
+#if !defined(NANOARROW_DEVICE_WITH_METAL)
+struct ArrowDevice* ArrowDeviceMetalDefaultDevice(void) {
+  return NULL;
+}
+
+ArrowErrorCode ArrowDeviceMetalInitDefaultDevice(struct ArrowDevice* device,
+                                                 struct ArrowError* error) {
+  NANOARROW_UNUSED(device);
+
+  ArrowErrorSet(error, "nanoarrow_device not built with Metal support");
+  return ENOTSUP;
+}
+
+ArrowErrorCode ArrowDeviceMetalInitBuffer(struct ArrowBuffer* buffer) {
+  NANOARROW_UNUSED(buffer);
+  return ENOTSUP;
+}
+
+ArrowErrorCode ArrowDeviceMetalAlignArrayBuffers(struct ArrowArray* array) {
+  NANOARROW_UNUSED(array);
+  return ENOTSUP;
+}
+#endif
diff --git a/src/nanoarrow/nanoarrow_device_hpp_test.cc 
b/src/nanoarrow/device/device_hpp_test.cc
similarity index 100%
rename from src/nanoarrow/nanoarrow_device_hpp_test.cc
rename to src/nanoarrow/device/device_hpp_test.cc
diff --git a/src/nanoarrow/nanoarrow_device_test.cc 
b/src/nanoarrow/device/device_test.cc
similarity index 100%
rename from src/nanoarrow/nanoarrow_device_test.cc
rename to src/nanoarrow/device/device_test.cc
diff --git a/src/nanoarrow/nanoarrow_device_metal.cc 
b/src/nanoarrow/device/metal.cc
similarity index 96%
rename from src/nanoarrow/nanoarrow_device_metal.cc
rename to src/nanoarrow/device/metal.cc
index 1a2cb29d..17083a9e 100644
--- a/src/nanoarrow/nanoarrow_device_metal.cc
+++ b/src/nanoarrow/device/metal.cc
@@ -25,7 +25,6 @@
 #include <Metal/Metal.hpp>
 
 #include "nanoarrow/nanoarrow_device.hpp"
-#include "nanoarrow/nanoarrow_device_metal.h"
 
 // If non-null, caller must ->release() the return value. This doesn't
 // release the underlying memory (which must be managed separately).
@@ -107,13 +106,15 @@ static void ArrowDeviceMetalAllocatorFree(struct 
ArrowBufferAllocator* allocator
   free(ptr);
 }
 
-void ArrowDeviceMetalInitBuffer(struct ArrowBuffer* buffer) {
+ArrowErrorCode ArrowDeviceMetalInitBuffer(struct ArrowBuffer* buffer) {
   buffer->allocator.reallocate = &ArrowDeviceMetalAllocatorReallocate;
   buffer->allocator.free = &ArrowDeviceMetalAllocatorFree;
   buffer->allocator.private_data = nullptr;
   buffer->data = nullptr;
   buffer->size_bytes = 0;
   buffer->capacity_bytes = 0;
+
+  return NANOARROW_OK;
 }
 
 ArrowErrorCode ArrowDeviceMetalAlignArrayBuffers(struct ArrowArray* array) {
@@ -122,7 +123,7 @@ ArrowErrorCode ArrowDeviceMetalAlignArrayBuffers(struct 
ArrowArray* array) {
 
   for (int64_t i = 0; i < array->n_buffers; i++) {
     buffer = ArrowArrayBuffer(array, i);
-    ArrowDeviceMetalInitBuffer(&new_buffer);
+    NANOARROW_RETURN_NOT_OK(ArrowDeviceMetalInitBuffer(&new_buffer));
     NANOARROW_RETURN_NOT_OK(
         ArrowBufferAppend(&new_buffer, buffer->data, buffer->size_bytes));
     ArrowBufferReset(buffer);
@@ -186,7 +187,7 @@ static ArrowErrorCode ArrowDeviceMetalBufferInit(struct 
ArrowDevice* device_src,
   if (device_src->device_type == ARROW_DEVICE_CPU &&
       device_dst->device_type == ARROW_DEVICE_METAL) {
     struct ArrowBuffer tmp;
-    ArrowDeviceMetalInitBuffer(&tmp);
+    NANOARROW_RETURN_NOT_OK(ArrowDeviceMetalInitBuffer(&tmp));
     NANOARROW_RETURN_NOT_OK(ArrowBufferAppend(&tmp, src.data.as_uint8, 
src.size_bytes));
     ArrowBufferMove(&tmp, dst);
     return NANOARROW_OK;
@@ -194,7 +195,7 @@ static ArrowErrorCode ArrowDeviceMetalBufferInit(struct 
ArrowDevice* device_src,
   } else if (device_src->device_type == ARROW_DEVICE_METAL &&
              device_dst->device_type == ARROW_DEVICE_METAL) {
     struct ArrowBuffer tmp;
-    ArrowDeviceMetalInitBuffer(&tmp);
+    NANOARROW_RETURN_NOT_OK(ArrowDeviceMetalInitBuffer(&tmp));
     NANOARROW_RETURN_NOT_OK(ArrowBufferAppend(&tmp, src.data.as_uint8, 
src.size_bytes));
     ArrowBufferMove(&tmp, dst);
     return NANOARROW_OK;
@@ -202,7 +203,7 @@ static ArrowErrorCode ArrowDeviceMetalBufferInit(struct 
ArrowDevice* device_src,
   } else if (device_src->device_type == ARROW_DEVICE_METAL &&
              device_dst->device_type == ARROW_DEVICE_CPU) {
     struct ArrowBuffer tmp;
-    ArrowDeviceMetalInitBuffer(&tmp);
+    NANOARROW_RETURN_NOT_OK(ArrowDeviceMetalInitBuffer(&tmp));
     NANOARROW_RETURN_NOT_OK(ArrowBufferAppend(&tmp, src.data.as_uint8, 
src.size_bytes));
     ArrowBufferMove(&tmp, dst);
     return NANOARROW_OK;
@@ -303,8 +304,8 @@ static ArrowErrorCode ArrowDeviceMetalSynchronize(struct 
ArrowDevice* device,
 
   // auto event = reinterpret_cast<MTL::SharedEvent*>(sync_event);
   // event->notifyListener(
-  //   listener, event->signaledValue(), ^(MTL::SharedEvent* pEvent, uint64_t 
value) {
-  //     pEvent->signaledValue = value + 1;
+  //   listener, event->signaledValue(), ^(MTL::SharedEvent* event, uint64_t 
value) {
+  //     event->signaledValue = value + 1;
   //   });
 
   // listener->release();
diff --git a/src/nanoarrow/nanoarrow_device_metal_test.cc 
b/src/nanoarrow/device/metal_test.cc
similarity index 98%
rename from src/nanoarrow/nanoarrow_device_metal_test.cc
rename to src/nanoarrow/device/metal_test.cc
index 679d655b..65b1557e 100644
--- a/src/nanoarrow/nanoarrow_device_metal_test.cc
+++ b/src/nanoarrow/device/metal_test.cc
@@ -22,7 +22,6 @@
 #include <Metal/Metal.hpp>
 
 #include "nanoarrow/nanoarrow_device.hpp"
-#include "nanoarrow/nanoarrow_device_metal.h"
 
 TEST(NanoarrowDeviceMetal, DefaultDevice) {
   nanoarrow::device::UniqueDevice device;
@@ -41,7 +40,7 @@ TEST(NanoarrowDeviceMetal, DeviceGpuBufferInit) {
   struct ArrowBufferView cpu_view = {data, sizeof(data)};
 
   struct ArrowBuffer buffer_aligned;
-  ArrowDeviceMetalInitBuffer(&buffer_aligned);
+  ASSERT_EQ(ArrowDeviceMetalInitBuffer(&buffer_aligned), NANOARROW_OK);
   ASSERT_EQ(ArrowBufferAppend(&buffer_aligned, data, sizeof(data)), 
NANOARROW_OK);
   struct ArrowBufferView gpu_view = {buffer_aligned.data, sizeof(data)};
 
@@ -162,7 +161,7 @@ TEST(NanoarrowDeviceMetal, DeviceAlignedBuffer) {
   int64_t data[] = {1, 2, 3, 4, 5, 6, 7, 8};
   struct ArrowBufferView view = {data, sizeof(data)};
 
-  ArrowDeviceMetalInitBuffer(&buffer);
+  ASSERT_EQ(ArrowDeviceMetalInitBuffer(&buffer), NANOARROW_OK);
   ASSERT_EQ(ArrowBufferAppendBufferView(&buffer, view), NANOARROW_OK);
   EXPECT_EQ(memcmp(buffer.data, data, sizeof(data)), 0);
   EXPECT_EQ(buffer.capacity_bytes, 64);
@@ -185,7 +184,7 @@ TEST(NanoarrowDeviceMetal, DeviceAlignedBuffer) {
 
   // When we reallocate to an invalid size, we get null
   ArrowBufferReset(&buffer);
-  ArrowDeviceMetalInitBuffer(&buffer);
+  ASSERT_EQ(ArrowDeviceMetalInitBuffer(&buffer), NANOARROW_OK);
   EXPECT_EQ(ArrowBufferReserve(&buffer, std::numeric_limits<intptr_t>::max()), 
ENOMEM);
   EXPECT_EQ(buffer.data, nullptr);
   EXPECT_EQ(buffer.allocator.private_data, nullptr);
diff --git a/src/nanoarrow/nanoarrow_ipc_decoder.c b/src/nanoarrow/ipc/decoder.c
similarity index 99%
rename from src/nanoarrow/nanoarrow_ipc_decoder.c
rename to src/nanoarrow/ipc/decoder.c
index 6048b0f1..e092a218 100644
--- a/src/nanoarrow/nanoarrow_ipc_decoder.c
+++ b/src/nanoarrow/ipc/decoder.c
@@ -43,9 +43,9 @@
 
 #endif
 
+#include "nanoarrow/ipc/flatcc_generated.h"
 #include "nanoarrow/nanoarrow.h"
 #include "nanoarrow/nanoarrow_ipc.h"
-#include "nanoarrow/nanoarrow_ipc_flatcc_generated.h"
 
 // R 3.6 / Windows builds on a very old toolchain that does not define ENODATA
 #if defined(_WIN32) && !defined(_MSC_VER) && !defined(ENODATA)
diff --git a/src/nanoarrow/nanoarrow_ipc_decoder_test.cc 
b/src/nanoarrow/ipc/decoder_test.cc
similarity index 99%
rename from src/nanoarrow/nanoarrow_ipc_decoder_test.cc
rename to src/nanoarrow/ipc/decoder_test.cc
index 6f4e4093..d17e7ee4 100644
--- a/src/nanoarrow/nanoarrow_ipc_decoder_test.cc
+++ b/src/nanoarrow/ipc/decoder_test.cc
@@ -26,7 +26,7 @@
 // For bswap32()
 #include "flatcc/portable/pendian.h"
 
-#include "nanoarrow_ipc.h"
+#include "nanoarrow/nanoarrow_ipc.h"
 
 using namespace arrow;
 
diff --git a/src/nanoarrow/nanoarrow_ipc_files_test.cc 
b/src/nanoarrow/ipc/files_test.cc
similarity index 99%
rename from src/nanoarrow/nanoarrow_ipc_files_test.cc
rename to src/nanoarrow/ipc/files_test.cc
index 4b4428e1..76582327 100644
--- a/src/nanoarrow/nanoarrow_ipc_files_test.cc
+++ b/src/nanoarrow/ipc/files_test.cc
@@ -28,9 +28,9 @@
 #include <arrow/table.h>
 #include <gtest/gtest.h>
 
-#include "nanoarrow.hpp"
-#include "nanoarrow_ipc.h"
-#include "nanoarrow_testing.hpp"
+#include "nanoarrow/nanoarrow.hpp"
+#include "nanoarrow/nanoarrow_ipc.h"
+#include "nanoarrow/nanoarrow_testing.hpp"
 
 #include "flatcc/portable/pendian_detect.h"
 
diff --git a/src/nanoarrow/nanoarrow_ipc_flatcc_generated.h 
b/src/nanoarrow/ipc/flatcc_generated.h
similarity index 100%
rename from src/nanoarrow/nanoarrow_ipc_flatcc_generated.h
rename to src/nanoarrow/ipc/flatcc_generated.h
diff --git a/src/nanoarrow/nanoarrow_ipc_hpp_test.cc 
b/src/nanoarrow/ipc/ipc_hpp_test.cc
similarity index 97%
rename from src/nanoarrow/nanoarrow_ipc_hpp_test.cc
rename to src/nanoarrow/ipc/ipc_hpp_test.cc
index 38edb8c3..ec3af84b 100644
--- a/src/nanoarrow/nanoarrow_ipc_hpp_test.cc
+++ b/src/nanoarrow/ipc/ipc_hpp_test.cc
@@ -17,7 +17,7 @@
 
 #include <gtest/gtest.h>
 
-#include "nanoarrow_ipc.hpp"
+#include "nanoarrow/nanoarrow_ipc.hpp"
 
 TEST(NanoarrowIpcHppTest, NanoarrowIpcHppTestUniqueDecoder) {
   nanoarrow::ipc::UniqueDecoder decoder;
diff --git a/src/nanoarrow/nanoarrow_ipc_reader.c b/src/nanoarrow/ipc/reader.c
similarity index 100%
rename from src/nanoarrow/nanoarrow_ipc_reader.c
rename to src/nanoarrow/ipc/reader.c
diff --git a/src/nanoarrow/nanoarrow_ipc_reader_test.cc 
b/src/nanoarrow/ipc/reader_test.cc
similarity index 99%
rename from src/nanoarrow/nanoarrow_ipc_reader_test.cc
rename to src/nanoarrow/ipc/reader_test.cc
index 8010b3bd..4af8d096 100644
--- a/src/nanoarrow/nanoarrow_ipc_reader_test.cc
+++ b/src/nanoarrow/ipc/reader_test.cc
@@ -19,7 +19,7 @@
 
 #include <stdio.h>
 
-#include "nanoarrow_ipc.h"
+#include "nanoarrow/nanoarrow_ipc.h"
 
 static uint8_t kSimpleSchema[] = {
     0xff, 0xff, 0xff, 0xff, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
0x00, 0x00,
diff --git a/src/nanoarrow/nanoarrow.h b/src/nanoarrow/nanoarrow.h
index 84d59850..58cb877e 100644
--- a/src/nanoarrow/nanoarrow.h
+++ b/src/nanoarrow/nanoarrow.h
@@ -22,7 +22,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 
-#include "nanoarrow_types.h"
+#include "nanoarrow/common/inline_types.h"
 
 // If using CMake, optionally pass -DNANOARROW_NAMESPACE=MyNamespace which 
will set this
 // define in nanoarrow_config.h. If not, you can optionally #define 
NANOARROW_NAMESPACE
@@ -1170,8 +1170,8 @@ ArrowErrorCode ArrowBasicArrayStreamValidate(const struct 
ArrowArrayStream* arra
 #endif
 
 // Inline function definitions
-#include "array_inline.h"
-#include "buffer_inline.h"
+#include "nanoarrow/common/inline_array.h"
+#include "nanoarrow/common/inline_buffer.h"
 
 #ifdef __cplusplus
 }
diff --git a/src/nanoarrow/nanoarrow_device.h b/src/nanoarrow/nanoarrow_device.h
index 339a8875..b284a9aa 100644
--- a/src/nanoarrow/nanoarrow_device.h
+++ b/src/nanoarrow/nanoarrow_device.h
@@ -145,6 +145,17 @@ static inline void ArrowDeviceArrayMove(struct 
ArrowDeviceArray* src,
 #define ArrowDeviceBasicArrayStreamInit \
   NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceBasicArrayStreamInit)
 
+#define ArrowDeviceCuda NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceCuda)
+
+#define ArrowDeviceMetalDefaultDevice \
+  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalDefaultDevice)
+#define ArrowDeviceMetalInitDefaultDevice \
+  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalInitDefaultDevice)
+#define ArrowDeviceMetalInitBuffer \
+  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalInitBuffer)
+#define ArrowDeviceMetalAlignArrayBuffers \
+  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalAlignArrayBuffers)
+
 #endif
 
 /// \defgroup nanoarrow_device Nanoarrow Device extension
@@ -327,6 +338,62 @@ ArrowErrorCode ArrowDeviceBasicArrayStreamInit(
 
 /// @}
 
+/// \defgroup nanoarrow_device_cuda CUDA Device extension
+///
+/// A CUDA (i.e., `cuda_runtime_api.h`) implementation of the Arrow C Device
+/// interface.
+///
+/// @{
+
+/// \brief Get a CUDA device from type and ID
+///
+/// device_type must be one of ARROW_DEVICE_CUDA or ARROW_DEVICE_CUDA_HOST;
+/// device_id must be between 0 and cudaGetDeviceCount - 1.
+struct ArrowDevice* ArrowDeviceCuda(ArrowDeviceType device_type, int64_t 
device_id);
+
+/// @}
+
+/// \defgroup nanoarrow_device_metal Apple Metal Device extension
+///
+/// An Apple Metal implementation of the Arrow C Device interface, primarily 
targeted to
+/// the M1 series of CPU/GPUs that feature shared CPU/GPU memory. Even though 
the memory
+/// regions are shared, it is currently not possible to wrap an arbitrary CPU 
memory
+/// region as an `MTL::Buffer*` unless that memory region is page-aligned. 
Because of
+/// this, a copy is still required in most cases to make memory GPU 
accessible. After GPU
+/// calculations are complete; however, moving the buffers back to the CPU is 
zero-copy.
+///
+/// Sync events are represented as an `MTL::Event*`. The degree to which the 
pointers
+/// to `MTL::Event*` are stable across metal-cpp versions/builds is currently 
unknown.
+///
+/// @{
+
+/// \brief A pointer to a default metal device singleton
+struct ArrowDevice* ArrowDeviceMetalDefaultDevice(void);
+
+/// \brief Initialize a preallocated device struct with the default metal 
device
+ArrowErrorCode ArrowDeviceMetalInitDefaultDevice(struct ArrowDevice* device,
+                                                 struct ArrowError* error);
+
+/// \brief Initialize a buffer with the Metal allocator
+///
+/// Metal uses shared memory with the CPU; however, only page-aligned buffers
+/// or buffers created explicitly using the Metal API can be sent to the GPU.
+/// This buffer's allocator uses the Metal API so that it is cheaper to send
+/// buffers to the GPU later. You can use, append to, or move this buffer just
+/// like a normal ArrowBuffer.
+ArrowErrorCode ArrowDeviceMetalInitBuffer(struct ArrowBuffer* buffer);
+
+/// \brief Convert an ArrowArray to buffers that use the Metal allocator
+///
+/// Replaces buffers from a given ArrowArray with ones that use the Metal
+/// allocator, copying existing content where necessary. The array is still
+/// valid to use just like a normal ArrowArray that was initialized with
+/// ArrowArrayInitFromType() (i.e., it can be appended to and finished with
+/// validation).
+ArrowErrorCode ArrowDeviceMetalAlignArrayBuffers(struct ArrowArray* array);
+
+/// @}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/nanoarrow/nanoarrow_device_cuda.h 
b/src/nanoarrow/nanoarrow_device_cuda.h
deleted file mode 100644
index 055073e1..00000000
--- a/src/nanoarrow/nanoarrow_device_cuda.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#ifndef NANOARROW_DEVICE_CUDA_H_INCLUDED
-#define NANOARROW_DEVICE_CUDA_H_INCLUDED
-
-#include "nanoarrow/nanoarrow_device.h"
-
-#ifdef NANOARROW_NAMESPACE
-
-#define ArrowDeviceCuda NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceCuda)
-
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/// \defgroup nanoarrow_device_cuda CUDA Device extension
-///
-/// A CUDA (i.e., `cuda_runtime_api.h`) implementation of the Arrow C Device
-/// interface.
-///
-/// @{
-
-/// \brief Get a CUDA device from type and ID
-///
-/// device_type must be one of ARROW_DEVICE_CUDA or ARROW_DEVICE_CUDA_HOST;
-/// device_id must be between 0 and cudaGetDeviceCount - 1.
-struct ArrowDevice* ArrowDeviceCuda(ArrowDeviceType device_type, int64_t 
device_id);
-
-/// @}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/nanoarrow/nanoarrow_device_metal.h 
b/src/nanoarrow/nanoarrow_device_metal.h
deleted file mode 100644
index cc29fa0f..00000000
--- a/src/nanoarrow/nanoarrow_device_metal.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-#ifndef NANOARROW_DEVICE_METAL_H_INCLUDED
-#define NANOARROW_DEVICE_METAL_H_INCLUDED
-
-#include "nanoarrow/nanoarrow_device.h"
-
-#ifdef NANOARROW_NAMESPACE
-
-#define ArrowDeviceMetalDefaultDevice \
-  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalDefaultDevice)
-#define ArrowDeviceMetalInitDefaultDevice \
-  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalInitDefaultDevice)
-#define ArrowDeviceMetalInitBuffer \
-  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalInitBuffer)
-#define ArrowDeviceMetalAlignArrayBuffers \
-  NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowDeviceMetalAlignArrayBuffers)
-
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/// \defgroup nanoarrow_device_metal Apple Metal Device extension
-///
-/// An Apple Metal implementation of the Arrow C Device interface, primarily 
targeted to
-/// the M1 series of CPU/GPUs that feature shared CPU/GPU memory. Even though 
the memory
-/// regions are shared, it is currently not possible to wrap an arbitrary CPU 
memory
-/// region as an `MTL::Buffer*` unless that memory region is page-aligned. 
Because of
-/// this, a copy is still required in most cases to make memory GPU 
accessible. After GPU
-/// calculations are complete; however, moving the buffers back to the CPU is 
zero-copy.
-///
-/// Sync events are represented as an `MTL::Event*`. The degree to which the 
pointers
-/// to `MTL::Event*` are stable across metal-cpp versions/builds is currently 
unknown.
-///
-/// @{
-
-/// \brief A pointer to a default metal device singleton
-struct ArrowDevice* ArrowDeviceMetalDefaultDevice(void);
-
-/// \brief Initialize a preallocated device struct with the default metal 
device
-ArrowErrorCode ArrowDeviceMetalInitDefaultDevice(struct ArrowDevice* device,
-                                                 struct ArrowError* error);
-
-/// \brief Initialize a buffer with the Metal allocator
-///
-/// Metal uses shared memory with the CPU; however, only page-aligned buffers
-/// or buffers created explicitly using the Metal API can be sent to the GPU.
-/// This buffer's allocator uses the Metal API so that it is cheaper to send
-/// buffers to the GPU later. You can use, append to, or move this buffer just
-/// like a normal ArrowBuffer.
-void ArrowDeviceMetalInitBuffer(struct ArrowBuffer* buffer);
-
-/// \brief Convert an ArrowArray to buffers that use the Metal allocator
-///
-/// Replaces buffers from a given ArrowArray with ones that use the Metal
-/// allocator, copying existing content where necessary. The array is still
-/// valid to use just like a normal ArrowArray that was initialized with
-/// ArrowArrayInitFromType() (i.e., it can be appended to and finished with
-/// validation).
-ArrowErrorCode ArrowDeviceMetalAlignArrayBuffers(struct ArrowArray* array);
-
-/// @}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/nanoarrow/nanoarrow_testing_test.cc 
b/src/nanoarrow/testing/testing_test.cc
similarity index 100%
rename from src/nanoarrow/nanoarrow_testing_test.cc
rename to src/nanoarrow/testing/testing_test.cc


Reply via email to