widestring 1.2.1

A wide string Rust library for converting to and from wide strings, such as those often used in Windows API or other FFI libaries. Both `u16` and `u32` string types are provided, including support for UTF-16 and UTF-32, malformed encoding, C-style strings, etc.
Documentation
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="widestring::ucstr::U16CStr">
    <DisplayString>{(char16_t*)this,su}</DisplayString>
    <StringView>(char16_t*)this,su</StringView>
  </Type>

  <Type Name="widestring::ucstr::U32CStr">
    <DisplayString>{(char32_t*)this,s32}</DisplayString>
    <StringView>(char32_t*)this,s32</StringView>
  </Type>

  <Type Name="widestring::ucstring::U16CString">
    <DisplayString>{(char16_t*)inner.data_ptr,[inner.length]su}</DisplayString>
    <StringView>(char16_t*)inner.data_ptr,[inner.length]su</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.length</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.length</Size>
            <ValuePointer>(char16_t*)inner.data_ptr</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>

  <Type Name="widestring::ucstring::U32CString">
    <DisplayString>{(char32_t*)inner.data_ptr,[inner.length]s32}</DisplayString>
    <StringView>(char32_t*)inner.data_ptr,[inner.length]s32</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.length</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.length</Size>
            <ValuePointer>(char32_t*)inner.data_ptr</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>

  <Type Name="widestring::ustring::U16String">
    <DisplayString>{(char16_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]su}</DisplayString>
    <StringView>(char16_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]su</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.len</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.len</Size>
            <ValuePointer>(char16_t*)inner.buf.inner.ptr.pointer.pointer</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>

  <Type Name="widestring::ustring::U32String">
    <DisplayString>{(char32_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]s32}</DisplayString>
    <StringView>(char32_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]s32</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.len</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.len</Size>
            <ValuePointer>(char32_t*)inner.buf.inner.ptr.pointer.pointer</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>

  <Type Name="widestring::utfstring::Utf16String">
    <DisplayString>{(char16_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]su}</DisplayString>
    <StringView>(char16_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]su</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.len</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.len</Size>
            <ValuePointer>(char16_t*)inner.buf.inner.ptr.pointer.pointer</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>

  <Type Name="widestring::utfstring::Utf32String">
    <DisplayString>{(char32_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]s32}</DisplayString>
    <StringView>{(char32_t*)inner.buf.inner.ptr.pointer.pointer,[inner.len]s32}</StringView>
    <Expand>
      <Item Name="[len]" ExcludeView="simple">inner.len</Item>
      <Synthetic Name="[chars]">
        <Expand>
          <ArrayItems>
            <Size>inner.len</Size>
            <ValuePointer>(char32_t*)inner.buf.inner.ptr.pointer.pointer</ValuePointer>
          </ArrayItems>
        </Expand>
      </Synthetic>
    </Expand>
  </Type>
</AutoVisualizer>