Fix slice compilation on MSVC
cxxbridge-demo.lib(blobstore.o) : error LNK2019: unresolved external symbol "void __cdecl sliceInit(void *,void const *,unsigned __int64)" (?sliceInit@@YAXPEAXPEBX_K@Z) referenced in function "public: __cdecl rust::cxxbridge1::Slice<unsigned char const >::Slice<unsigned char const >(unsigned char const *,unsigned __int64)" (??0?$Slice@$$CBE@cxxbridge1@rust@@QEAA@PEBE_K@Z)
cxxbridge-demo.lib(blobstore.o) : error LNK2001: unresolved external symbol "void __cdecl sliceInit(void *,void const *,unsigned __int64)" (?sliceInit@@YAXPEAXPEBX_K@Z)
cxxbridge-demo.lib(main.rs.o) : error LNK2001: unresolved external symbol "void __cdecl sliceInit(void *,void const *,unsigned __int64)" (?sliceInit@@YAXPEAXPEBX_K@Z)
cxxbridge-demo.lib(main.rs.o) : error LNK2001: unresolved external symbol "void __cdecl sliceInit(void *,void const *,unsigned __int64)" (?sliceInit@@YAXPEAXPEBX_K@Z)
Hint on symbols that are defined and could potentially match:
"void __cdecl rust::cxxbridge1::sliceInit(void *,void const *,unsigned __int64)" (?sliceInit@cxxbridge1@rust@@YAXPEAXPEBX_K@Z)
cxxbridge-demo.lib(blobstore.o) : error LNK2019: unresolved external symbol "unsigned __int64 __cdecl sliceLen(void const *)" (?sliceLen@@YA_KPEBX@Z) referenced in function "public: unsigned __int64 __cdecl rust::cxxbridge1::Slice<unsigned char const >::size(void)const " (?size@?$Slice@$$CBE@cxxbridge1@rust@@QEBA_KXZ)
cxxbridge-demo.lib(main.rs.o) : error LNK2001: unresolved external symbol "unsigned __int64 __cdecl sliceLen(void const *)" (?sliceLen@@YA_KPEBX@Z)
Hint on symbols that are defined and could potentially match:
"unsigned __int64 __cdecl rust::cxxbridge1::sliceLen(void const *)" (?sliceLen@cxxbridge1@rust@@YA_KPEBX@Z)
cxxbridge-demo.lib(blobstore.o) : error LNK2019: unresolved external symbol "void * __cdecl slicePtr(void const *)" (?slicePtr@@YAPEAXPEBX@Z) referenced in function "private: void * __cdecl rust::cxxbridge1::Slice<unsigned char const >::ptr(void)const " (?ptr@?$Slice@$$CBE@cxxbridge1@rust@@AEBAPEAXXZ)
cxxbridge-demo.lib(main.rs.o) : error LNK2001: unresolved external symbol "void * __cdecl slicePtr(void const *)" (?slicePtr@@YAPEAXPEBX@Z)
Hint on symbols that are defined and could potentially match:
"void * __cdecl rust::cxxbridge1::slicePtr(void const *)" (?slicePtr@cxxbridge1@rust@@YAPEAXPEBX@Z)
D:\a\cxx\cxx\target\debug\deps\demo.exe : fatal error LNK1120: 3 unresolved externals
diff --git a/include/cxx.h b/include/cxx.h
index a81fc21..acf2b1b 100644
--- a/include/cxx.h
+++ b/include/cxx.h
@@ -180,8 +180,6 @@
void swap(Slice &) noexcept;
private:
- void *ptr() const noexcept;
-
std::array<std::uintptr_t, 2> repr;
};
@@ -487,26 +485,27 @@
#ifndef CXXBRIDGE1_RUST_SLICE
#define CXXBRIDGE1_RUST_SLICE
+void sliceInit(void *, const void *, std::size_t) noexcept;
+void *slicePtr(const void *) noexcept;
+std::size_t sliceLen(const void *) noexcept;
+
template <typename T>
Slice<T>::Slice() noexcept {
- void sliceInit(void *, const void *, std::size_t) noexcept;
sliceInit(this, reinterpret_cast<void *>(align_of<T>()), 0);
}
template <typename T>
Slice<T>::Slice(T *s, std::size_t count) noexcept {
- void sliceInit(void *, const void *, std::size_t) noexcept;
sliceInit(this, const_cast<typename std::remove_const<T>::type *>(s), count);
}
template <typename T>
T *Slice<T>::data() const noexcept {
- return reinterpret_cast<T *>(this->ptr());
+ return reinterpret_cast<T *>(slicePtr(this));
}
template <typename T>
std::size_t Slice<T>::size() const noexcept {
- std::size_t sliceLen(const void *) noexcept;
return sliceLen(this);
}
@@ -523,7 +522,7 @@
template <typename T>
T &Slice<T>::operator[](std::size_t n) const noexcept {
assert(n < this->size());
- auto pos = static_cast<char *>(this->ptr()) + size_of<T>() * n;
+ auto pos = static_cast<char *>(slicePtr(this)) + size_of<T>() * n;
return *reinterpret_cast<T *>(pos);
}
@@ -663,7 +662,7 @@
template <typename T>
typename Slice<T>::iterator Slice<T>::begin() const noexcept {
iterator it;
- it.pos = this->ptr();
+ it.pos = slicePtr(this);
it.stride = size_of<T>();
return it;
}
@@ -679,12 +678,6 @@
void Slice<T>::swap(Slice &rhs) noexcept {
std::swap(*this, rhs);
}
-
-template <typename T>
-void *Slice<T>::ptr() const noexcept {
- void *slicePtr(const void *) noexcept;
- return slicePtr(this);
-}
#endif // CXXBRIDGE1_RUST_SLICE
#ifndef CXXBRIDGE1_RUST_BOX