7 #ifndef LLU_WSTP_STRINGS_H_
8 #define LLU_WSTP_STRINGS_H_
26 namespace EncodingConfig {
43 using StringData = std::unique_ptr<const CharType<E>[], ReleaseString<E>>;
66 static const std::string GetFName;
67 static const std::string PutFName;
70 static void put(WSLINK m,
const T*
string,
int len) {
71 static_assert(CharacterTypesCompatible<E, T>,
"Character type does not match the encoding in WS::String<E>::put");
73 auto* expectedStr =
reinterpret_cast<const CharT*
>(string);
78 const CharT* rawResult {};
82 return {rawResult, ReleaseString<E> {m, bytes, characters}};
86 static std::basic_string<T> getString(WSLINK m) {
87 static_assert(CharacterTypesCompatible<E, T>,
"Character type does not match the encoding in WS::String<E>::getString");
90 auto strData {get(m)};
92 auto bytes = strData.get_deleter().getLength();
94 auto* expectedData =
reinterpret_cast<const T*
>(strData.get());
95 auto strlen =
static_cast<typename StringType::size_type
>(bytes);
107 struct String<
Encoding::Undefined> {
110 static void put(WSLINK ,
const T* ,
int ) {
111 static_assert(dependent_false_v<T>,
"Trying to use WS::String<Encoding::Undefined>::put");
114 template<
typename T =
char>
115 static T* get(WSLINK ) {
116 static_assert(dependent_false_v<T>,
"Trying to use WS::String<Encoding::Undefined>::get");
121 static std::basic_string<T> getString(WSLINK ) {
122 static_assert(dependent_false_v<T>,
"Trying to use WS::String<Encoding::Undefined>::getString");
129 struct ReleaseString {
130 ReleaseString() =
default;
131 ReleaseString(WSLINK m,
int l,
int c) : m(m), length(l), chars(c) {}
133 void operator()(
const CharType<E>* data) {
134 String<E>::Release(m, data, length);
137 int getLength()
const {
141 int getCharacters()
const {
156 #define WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(E) \
158 GetStringFuncT<CharType<Encoding::E>> String<Encoding::E>::Get; \
160 PutStringFuncT<CharType<Encoding::E>> String<Encoding::E>::Put; \
162 ReleaseStringFuncT<CharType<Encoding::E>> String<Encoding::E>::Release; \
164 const std::string String<Encoding::E>::GetFName; \
166 const std::string String<Encoding::E>::PutFName;
168 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(Native)
169 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(Byte)
170 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(UTF8)
171 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(UTF16)
172 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(UCS2)
173 WS_STRING_DECLARE_SPECIALIZATIONS_OF_STATIC_MEMBERS(UTF32)
178 GetStringFuncT<CharType<Encoding::Native>> String<Encoding::Native>::Get = [](WSLINK m,
const char** strData,
int* len,
int* charCnt) {
179 *len = *charCnt = -1;
180 return WSGetString(m, strData);
183 PutStringFuncT<CharType<Encoding::Native>> String<Encoding::Native>::Put = [](WSLINK m,
const char* strData, int) {
return WSPutString(m, strData); };
185 ReleaseStringFuncT<CharType<Encoding::Native>> String<Encoding::Native>::Release = [](WSLINK m,
const char* strData, int) { WSReleaseString(m, strData); };
187 const std::string String<Encoding::Native>::GetFName =
"WSGetString";
189 const std::string String<Encoding::Native>::PutFName =
"WSPutString";
192 GetStringFuncT<CharType<Encoding::Byte>> String<Encoding::Byte>::Get = [](WSLINK m,
const unsigned char** strData,
int* len,
int* charCnt) {
197 PutStringFuncT<CharType<Encoding::Byte>> String<Encoding::Byte>::Put = WSPutByteString;
199 ReleaseStringFuncT<CharType<Encoding::Byte>> String<Encoding::Byte>::Release = WSReleaseByteString;
201 const std::string String<Encoding::Byte>::GetFName =
"WSGetByteString";
203 const std::string String<Encoding::Byte>::PutFName =
"WSPutByteString";
207 bool allASCIIQ(
const unsigned char* strData,
int len) {
208 return std::all_of(strData, strData + len, [](
unsigned char c) ->
bool {
return c <= 127; });
213 GetStringFuncT<CharType<Encoding::UTF8>> String<Encoding::UTF8>::Get = WSGetUTF8String;
215 PutStringFuncT<CharType<Encoding::UTF8>> String<Encoding::UTF8>::Put = [](WSLINK m,
const unsigned char* strData,
int len) ->
int {
217 return WSPutByteString(m, strData, len);
219 return WSPutUTF8String(m, strData, len);
223 ReleaseStringFuncT<CharType<Encoding::UTF8>> String<Encoding::UTF8>::Release = WSReleaseUTF8String;
225 const std::string String<Encoding::UTF8>::GetFName =
"WSGetUTF8String";
227 const std::string String<Encoding::UTF8>::PutFName =
"WSPut(UTF8/Byte)String";
230 GetStringFuncT<CharType<Encoding::UTF16>> String<Encoding::UTF16>::Get = WSGetUTF16String;
232 PutStringFuncT<CharType<Encoding::UTF16>> String<Encoding::UTF16>::Put = WSPutUTF16String;
234 ReleaseStringFuncT<CharType<Encoding::UTF16>> String<Encoding::UTF16>::Release = WSReleaseUTF16String;
236 const std::string String<Encoding::UTF16>::GetFName =
"WSGetUTF16String";
238 const std::string String<Encoding::UTF16>::PutFName =
"WSPutUTF16String";
241 GetStringFuncT<CharType<Encoding::UCS2>> String<Encoding::UCS2>::Get = [](WSLINK m,
const unsigned short** strData,
int* len,
int* charCnt) {
243 return WSGetUCS2String(m, strData, len);
246 PutStringFuncT<CharType<Encoding::UCS2>> String<Encoding::UCS2>::Put = WSPutUCS2String;
248 ReleaseStringFuncT<CharType<Encoding::UCS2>> String<Encoding::UCS2>::Release = WSReleaseUCS2String;
250 const std::string String<Encoding::UCS2>::GetFName =
"WSGetUCS2String";
252 const std::string String<Encoding::UCS2>::PutFName =
"WSPutUCS2String";
255 GetStringFuncT<CharType<Encoding::UTF32>> String<Encoding::UTF32>::Get = [](WSLINK m,
const unsigned int** strData,
int* len,
int* charCnt) {
257 return WSGetUTF32String(m, strData, len);
260 PutStringFuncT<CharType<Encoding::UTF32>> String<Encoding::UTF32>::Put = WSPutUTF32String;
262 ReleaseStringFuncT<CharType<Encoding::UTF32>> String<Encoding::UTF32>::Release = WSReleaseUTF32String;
264 const std::string String<Encoding::UTF32>::GetFName =
"WSGetUTF32String";
266 const std::string String<Encoding::UTF32>::PutFName =
"WSPutUTF32String";