Move primitive Vec C++ shims into cxx crate
diff --git a/src/cxx.cc b/src/cxx.cc
index 4351eda..63b2166 100644
--- a/src/cxx.cc
+++ b/src/cxx.cc
@@ -236,17 +236,54 @@
     ptr->~unique_ptr();                                                        \
   }
 
+#define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE)                                  \
+  void cxxbridge02$rust_vec$##RUST_TYPE##$drop(                                \
+      rust::Vec<CXX_TYPE> *ptr) noexcept;                                      \
+  size_t cxxbridge02$rust_vec$##RUST_TYPE##$len(                               \
+      const rust::Vec<CXX_TYPE> *ptr) noexcept;                                \
+  const CXX_TYPE *cxxbridge02$rust_vec$##RUST_TYPE##$data(                     \
+      const rust::Vec<CXX_TYPE> *ptr) noexcept;                                \
+  size_t cxxbridge02$rust_vec$##RUST_TYPE##$stride() noexcept;
+
+#define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE)                                      \
+  template <>                                                                  \
+  void rust::Vec<CXX_TYPE>::drop() noexcept {                                  \
+    return cxxbridge02$rust_vec$##RUST_TYPE##$drop(this);                      \
+  }                                                                            \
+  template <>                                                                  \
+  size_t rust::Vec<CXX_TYPE>::size() const noexcept {                          \
+    return cxxbridge02$rust_vec$##RUST_TYPE##$len(this);                       \
+  }                                                                            \
+  template <>                                                                  \
+  const CXX_TYPE *rust::Vec<CXX_TYPE>::data() const noexcept {                 \
+    return cxxbridge02$rust_vec$##RUST_TYPE##$data(this);                      \
+  }                                                                            \
+  template <>                                                                  \
+  size_t rust::Vec<CXX_TYPE>::stride() noexcept {                              \
+    return cxxbridge02$rust_vec$##RUST_TYPE##$stride();                        \
+  }
+
+// Usize and isize are the same type as one of the below.
+#define FOR_EACH_SIZED_PRIMITIVE(MACRO)                                        \
+  MACRO(u8, uint8_t)                                                           \
+  MACRO(u16, uint16_t)                                                         \
+  MACRO(u32, uint32_t)                                                         \
+  MACRO(u64, uint64_t)                                                         \
+  MACRO(i8, int8_t)                                                            \
+  MACRO(i16, int16_t)                                                          \
+  MACRO(i32, int32_t)                                                          \
+  MACRO(i64, int64_t)                                                          \
+  MACRO(f32, float)                                                            \
+  MACRO(f64, double)
+
+#define FOR_EACH_PRIMITIVE(MACRO)                                              \
+  FOR_EACH_SIZED_PRIMITIVE(MACRO)                                              \
+  MACRO(usize, size_t)                                                         \
+  MACRO(isize, rust::isize)
+
 extern "C" {
-STD_VECTOR_OPS(u8, uint8_t)
-STD_VECTOR_OPS(u16, uint16_t)
-STD_VECTOR_OPS(u32, uint32_t)
-STD_VECTOR_OPS(u64, uint64_t)
-STD_VECTOR_OPS(usize, size_t)
-STD_VECTOR_OPS(i8, int8_t)
-STD_VECTOR_OPS(i16, int16_t)
-STD_VECTOR_OPS(i32, int32_t)
-STD_VECTOR_OPS(i64, int64_t)
-STD_VECTOR_OPS(isize, rust::isize)
-STD_VECTOR_OPS(f32, float)
-STD_VECTOR_OPS(f64, double)
+FOR_EACH_PRIMITIVE(STD_VECTOR_OPS)
+FOR_EACH_SIZED_PRIMITIVE(RUST_VEC_EXTERNS)
 } // extern "C"
+
+FOR_EACH_SIZED_PRIMITIVE(RUST_VEC_OPS)