File: Windows.Win32.BSTR.g.cs
Project: src\src\System.Private.Windows.Core\src\System.Private.Windows.Core.csproj (System.Private.Windows.Core)
// ------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
// ------------------------------------------------------------------------------

#pragma warning disable CS1591,CS1573,CS0465,CS0649,CS8019,CS1570,CS1584,CS1658,CS0436,CS8981
using global::System;
using global::System.Diagnostics;
using global::System.Diagnostics.CodeAnalysis;
using global::System.Runtime.CompilerServices;
using global::System.Runtime.InteropServices;
using global::System.Runtime.Versioning;
using winmdroot = global::Windows.Win32;
namespace Windows.Win32
{
	namespace Foundation
	{
		[DebuggerDisplay("{Value}")]
		[global::System.CodeDom.Compiler.GeneratedCode("Microsoft.Windows.CsWin32", "0.3.151+58e949951d.RR")]
		internal unsafe readonly partial struct BSTR
			: IEquatable<BSTR>
		{
			internal readonly char* Value;

			internal BSTR(char* value) => this.Value = value;

			internal BSTR(IntPtr value):this((char*)value)
			{
			}

			public static implicit operator char*(BSTR value) => value.Value;

			public static explicit operator BSTR(char* value) => new BSTR(value);

			public static bool operator ==(BSTR left, BSTR right) => left.Value == right.Value;

			public static bool operator !=(BSTR left, BSTR right) => !(left == right);

			public bool Equals(BSTR other) => this.Value == other.Value;

			public override bool Equals(object obj) => obj is BSTR other && this.Equals(other);

			public override int GetHashCode() => unchecked((int)this.Value);


			public override string ToString() => this.Value != null ? Marshal.PtrToStringBSTR(new IntPtr(this.Value)) : null;

			public static implicit operator IntPtr(BSTR value) => new IntPtr(value.Value);

			public static explicit operator BSTR(IntPtr value) => new BSTR((char*)value.ToPointer());

			public static explicit operator BSTR(UIntPtr value) => new BSTR((char*)value.ToPointer());

			/// <summary>
			/// Gets the length of the BSTR in characters.
			/// </summary>
			internal unsafe int Length => this.Value is null ? 0 : checked((int)(*(((uint*)this.Value) - 1) / sizeof(char)));


			public static unsafe implicit operator ReadOnlySpan<char>(BSTR bstr) => bstr.Value != null ? new ReadOnlySpan<char>(bstr.Value, *((int*)bstr.Value - 1) / 2) : default(ReadOnlySpan<char>);


			internal ReadOnlySpan<char> AsSpan() => this;
		}
	}
}