tg_geometry 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +103 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +385 -0
- data/Rakefile +129 -0
- data/benchmark/_support.rb +115 -0
- data/benchmark/batch_packed_vs_loop.rb +27 -0
- data/benchmark/falcon_concurrency.rb +25 -0
- data/benchmark/flat_vs_rtree.rb +27 -0
- data/benchmark/gvl_threshold.rb +41 -0
- data/benchmark/objectspace_memsize.rb +17 -0
- data/benchmark/parse_throughput.rb +38 -0
- data/benchmark/rss_stability.rb +70 -0
- data/docs/ACTIVE_RECORD.md +26 -0
- data/docs/ARCHITECTURE.md +130 -0
- data/docs/AUTO_STRATEGY.md +15 -0
- data/docs/BENCHMARKING.md +75 -0
- data/docs/CASUAL_EXAMPLE.md +618 -0
- data/docs/CONCURRENCY.md +65 -0
- data/docs/ERROR_HANDLING.md +55 -0
- data/docs/EXPANSION_E_TO_H_STATUS.md +51 -0
- data/docs/FORMAT_COVERAGE.md +23 -0
- data/docs/FULL_TG_API_COVERAGE.md +109 -0
- data/docs/LIMITATIONS.md +61 -0
- data/docs/LOW_LEVEL_GEOMETRY.md +121 -0
- data/docs/MEMORY_OWNERSHIP.md +94 -0
- data/docs/RACTOR.md +40 -0
- data/docs/REGISTRY.md +37 -0
- data/docs/RELEASE_CHECKLIST.md +39 -0
- data/ext/tg_geometry/extconf.rb +91 -0
- data/ext/tg_geometry/tg_geometry_ext.c +3054 -0
- data/ext/tg_geometry/tg_geometry_vendor_rtree.c +1 -0
- data/ext/tg_geometry/tg_geometry_vendor_tg.c +24 -0
- data/ext/tg_geometry/vendor/.vendored +16 -0
- data/ext/tg_geometry/vendor/rtree/LICENSE +20 -0
- data/ext/tg_geometry/vendor/rtree/README.md +202 -0
- data/ext/tg_geometry/vendor/rtree/VERSION +3 -0
- data/ext/tg_geometry/vendor/rtree/rtree.c +840 -0
- data/ext/tg_geometry/vendor/rtree/rtree.h +105 -0
- data/ext/tg_geometry/vendor/tg/LICENSE +19 -0
- data/ext/tg_geometry/vendor/tg/README.md +197 -0
- data/ext/tg_geometry/vendor/tg/VERSION +3 -0
- data/ext/tg_geometry/vendor/tg/tg.c +16010 -0
- data/ext/tg_geometry/vendor/tg/tg.h +359 -0
- data/lib/tg/geometry/active_record_source.rb +57 -0
- data/lib/tg/geometry/registry.rb +119 -0
- data/lib/tg/geometry/version.rb +7 -0
- data/lib/tg/geometry.rb +6 -0
- data/lib/tg_geometry.rb +3 -0
- data/script/vendor_libs.rb +264 -0
- data/spec/block_10_rtree_strategy_spec.rb +82 -0
- data/spec/block_11_rtree_order_spec.rb +53 -0
- data/spec/block_12_batch_packed_spec.rb +55 -0
- data/spec/block_13_error_hardening_spec.rb +65 -0
- data/spec/block_14_memory_gc_hardening_spec.rb +116 -0
- data/spec/block_1_skeleton_spec.rb +45 -0
- data/spec/block_20_concurrency_spec.rb +157 -0
- data/spec/block_20_fuzz_spec.rb +145 -0
- data/spec/block_2_vendor_spec.rb +79 -0
- data/spec/block_3_geom_parse_spec.rb +89 -0
- data/spec/block_4_geom_api_spec.rb +90 -0
- data/spec/block_5_rect_api_spec.rb +96 -0
- data/spec/block_6_index_build_spec.rb +111 -0
- data/spec/block_7_index_owned_geometry_spec.rb +143 -0
- data/spec/block_8_index_borrowed_geometry_spec.rb +106 -0
- data/spec/block_9_flat_query_spec.rb +65 -0
- data/spec/expansion_a_auto_strategy_spec.rb +14 -0
- data/spec/expansion_b_registry_spec.rb +47 -0
- data/spec/expansion_c_active_record_source_spec.rb +42 -0
- data/spec/expansion_d_format_coverage_spec.rb +30 -0
- data/spec/expansion_e_low_level_geometry_spec.rb +82 -0
- data/spec/expansion_i_ractor_spec.rb +25 -0
- data/spec/expansion_j_full_tg_api_coverage_spec.rb +114 -0
- data/spec/spec_helper.rb +15 -0
- metadata +157 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "mkmf"
|
|
4
|
+
|
|
5
|
+
MINIMUM_RUBY_VERSION = Gem::Version.new("3.0.0")
|
|
6
|
+
current_ruby_version = Gem::Version.new(RUBY_VERSION)
|
|
7
|
+
|
|
8
|
+
if current_ruby_version < MINIMUM_RUBY_VERSION
|
|
9
|
+
abort "tg_geometry requires Ruby >= #{MINIMUM_RUBY_VERSION}; current Ruby is #{RUBY_VERSION}"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
VENDOR_DIR = File.expand_path("vendor", __dir__)
|
|
13
|
+
VENDORED_TG_DIR = File.join(VENDOR_DIR, "tg")
|
|
14
|
+
VENDORED_RTREE_DIR = File.join(VENDOR_DIR, "rtree")
|
|
15
|
+
|
|
16
|
+
required_vendor_files = [
|
|
17
|
+
File.join(VENDORED_TG_DIR, "tg.c"),
|
|
18
|
+
File.join(VENDORED_TG_DIR, "tg.h"),
|
|
19
|
+
File.join(VENDORED_TG_DIR, "VERSION"),
|
|
20
|
+
File.join(VENDORED_RTREE_DIR, "rtree.c"),
|
|
21
|
+
File.join(VENDORED_RTREE_DIR, "rtree.h"),
|
|
22
|
+
File.join(VENDORED_RTREE_DIR, "VERSION")
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
missing_vendor_files = required_vendor_files.reject { |path| File.file?(path) }
|
|
26
|
+
unless missing_vendor_files.empty?
|
|
27
|
+
abort "tg_geometry requires vendored tidwall/tg and rtree.c sources. Missing: #{missing_vendor_files.join(", ")}. Run `ruby script/vendor_libs.rb --sync`."
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
forbidden_defines = %w[TG_NOATOMICS RTREE_NOATOMICS]
|
|
31
|
+
forbidden_defines.each do |macro|
|
|
32
|
+
if ($CFLAGS.to_s.split + $CPPFLAGS.to_s.split + $defs).any? { |flag| flag.include?(macro) }
|
|
33
|
+
abort "tg_geometry must not define #{macro}; atomics are required by the release-core contract"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
$CFLAGS = [
|
|
38
|
+
$CFLAGS,
|
|
39
|
+
"-std=c11",
|
|
40
|
+
"-Wall",
|
|
41
|
+
"-Wextra",
|
|
42
|
+
"-Wpedantic",
|
|
43
|
+
"-O2"
|
|
44
|
+
].join(" ")
|
|
45
|
+
|
|
46
|
+
$INCFLAGS = [
|
|
47
|
+
$INCFLAGS,
|
|
48
|
+
# Ruby 3.x headers intentionally use newer C attributes/macros. Treat the
|
|
49
|
+
# Ruby include directories as system headers so -Wpedantic reports warnings
|
|
50
|
+
# from tg_geometry itself, not from the embedding Ruby version.
|
|
51
|
+
"-isystem $(arch_hdrdir)",
|
|
52
|
+
"-isystem $(hdrdir)/ruby/backward",
|
|
53
|
+
"-isystem $(hdrdir)",
|
|
54
|
+
"-I$(srcdir)/vendor/tg",
|
|
55
|
+
"-I$(srcdir)/vendor/rtree"
|
|
56
|
+
].join(" ")
|
|
57
|
+
|
|
58
|
+
unless try_compile(<<~C)
|
|
59
|
+
#include <stdatomic.h>
|
|
60
|
+
int main(void) { atomic_int x; atomic_init(&x, 0); return atomic_load(&x); }
|
|
61
|
+
C
|
|
62
|
+
abort "tg_geometry requires a C11 compiler with <stdatomic.h> support"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
required_functions = %w[
|
|
66
|
+
rb_gc_mark_movable
|
|
67
|
+
rb_gc_location
|
|
68
|
+
rb_gc_adjust_memory_usage
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
required_functions.each do |function|
|
|
72
|
+
next if have_func(function, "ruby.h")
|
|
73
|
+
|
|
74
|
+
abort "tg_geometry requires Ruby C API function #{function}; minimum supported Ruby is #{MINIMUM_RUBY_VERSION}"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
if have_macro("RB_NOGVL_OFFLOAD_SAFE", "ruby/thread.h")
|
|
78
|
+
$defs << "-DHAVE_RB_NOGVL_OFFLOAD_SAFE"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if ENV["TG_DEBUG_TEST"] == "1"
|
|
82
|
+
$defs << "-DTG_DEBUG_TEST"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
$srcs = [
|
|
86
|
+
"tg_geometry_ext.c",
|
|
87
|
+
"tg_geometry_vendor_tg.c",
|
|
88
|
+
"tg_geometry_vendor_rtree.c"
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
create_makefile("tg_geometry_ext_geometry_ext")
|