Variant.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. using System;
  2. using System.Diagnostics.CodeAnalysis;
  3. using System.Runtime.CompilerServices;
  4. using Godot.NativeInterop;
  5. namespace Godot;
  6. #nullable enable
  7. [SuppressMessage("ReSharper", "RedundantNameQualifier")]
  8. public partial struct Variant : IDisposable
  9. {
  10. internal godot_variant.movable NativeVar;
  11. private object? _obj;
  12. private Disposer? _disposer;
  13. private sealed class Disposer : IDisposable
  14. {
  15. private godot_variant.movable _native;
  16. private WeakReference<IDisposable>? _weakReferenceToSelf;
  17. public Disposer(in godot_variant.movable nativeVar)
  18. {
  19. _native = nativeVar;
  20. _weakReferenceToSelf = DisposablesTracker.RegisterDisposable(this);
  21. }
  22. ~Disposer()
  23. {
  24. Dispose(false);
  25. }
  26. public void Dispose()
  27. {
  28. Dispose(true);
  29. GC.SuppressFinalize(this);
  30. }
  31. private void Dispose(bool disposing)
  32. {
  33. _native.DangerousSelfRef.Dispose();
  34. if (_weakReferenceToSelf != null)
  35. {
  36. DisposablesTracker.UnregisterDisposable(_weakReferenceToSelf);
  37. }
  38. }
  39. }
  40. private Variant(in godot_variant nativeVar)
  41. {
  42. NativeVar = (godot_variant.movable)nativeVar;
  43. _obj = null;
  44. switch (nativeVar.Type)
  45. {
  46. case Type.Nil:
  47. case Type.Bool:
  48. case Type.Int:
  49. case Type.Float:
  50. case Type.Vector2:
  51. case Type.Vector2i:
  52. case Type.Rect2:
  53. case Type.Rect2i:
  54. case Type.Vector3:
  55. case Type.Vector3i:
  56. case Type.Plane:
  57. case Type.Quaternion:
  58. case Type.Color:
  59. case Type.Rid:
  60. _disposer = null;
  61. break;
  62. default:
  63. {
  64. _disposer = new Disposer(NativeVar);
  65. break;
  66. }
  67. }
  68. }
  69. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  70. // Explicit name to make it very clear
  71. public static Variant CreateTakingOwnershipOfDisposableValue(in godot_variant nativeValueToOwn) =>
  72. new(nativeValueToOwn);
  73. // Explicit name to make it very clear
  74. public static Variant CreateCopyingBorrowed(in godot_variant nativeValueToOwn) =>
  75. new(NativeFuncs.godotsharp_variant_new_copy(nativeValueToOwn));
  76. /// <summary>
  77. /// Constructs a new <see cref="Godot.NativeInterop.godot_variant"/> from this instance.
  78. /// The caller is responsible of disposing the new instance to avoid memory leaks.
  79. /// </summary>
  80. public godot_variant CopyNativeVariant() =>
  81. NativeFuncs.godotsharp_variant_new_copy((godot_variant)NativeVar);
  82. public void Dispose()
  83. {
  84. _disposer?.Dispose();
  85. NativeVar = default;
  86. _obj = null;
  87. }
  88. // TODO: Consider renaming Variant.Type to VariantType and this property to Type. VariantType would also avoid ambiguity with System.Type.
  89. public Type VariantType => NativeVar.DangerousSelfRef.Type;
  90. public override string ToString() => AsString();
  91. public object? Obj
  92. {
  93. get
  94. {
  95. if (_obj == null)
  96. _obj = Marshaling.ConvertVariantToManagedObject((godot_variant)NativeVar);
  97. return _obj;
  98. }
  99. }
  100. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  101. public bool AsBool() =>
  102. VariantUtils.ConvertToBool((godot_variant)NativeVar);
  103. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  104. public char AsChar() =>
  105. (char)VariantUtils.ConvertToUInt16((godot_variant)NativeVar);
  106. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  107. public sbyte AsSByte() =>
  108. VariantUtils.ConvertToInt8((godot_variant)NativeVar);
  109. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  110. public short AsInt16() =>
  111. VariantUtils.ConvertToInt16((godot_variant)NativeVar);
  112. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  113. public int AsInt32() =>
  114. VariantUtils.ConvertToInt32((godot_variant)NativeVar);
  115. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  116. public long AsInt64() =>
  117. VariantUtils.ConvertToInt64((godot_variant)NativeVar);
  118. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  119. public byte AsByte() =>
  120. VariantUtils.ConvertToUInt8((godot_variant)NativeVar);
  121. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  122. public ushort AsUInt16() =>
  123. VariantUtils.ConvertToUInt16((godot_variant)NativeVar);
  124. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  125. public uint AsUInt32() =>
  126. VariantUtils.ConvertToUInt32((godot_variant)NativeVar);
  127. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  128. public ulong AsUInt64() =>
  129. VariantUtils.ConvertToUInt64((godot_variant)NativeVar);
  130. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  131. public float AsSingle() =>
  132. VariantUtils.ConvertToFloat32((godot_variant)NativeVar);
  133. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  134. public double AsDouble() =>
  135. VariantUtils.ConvertToFloat64((godot_variant)NativeVar);
  136. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  137. public string AsString() =>
  138. VariantUtils.ConvertToStringObject((godot_variant)NativeVar);
  139. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  140. public Vector2 AsVector2() =>
  141. VariantUtils.ConvertToVector2((godot_variant)NativeVar);
  142. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  143. public Vector2i AsVector2i() =>
  144. VariantUtils.ConvertToVector2i((godot_variant)NativeVar);
  145. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  146. public Rect2 AsRect2() =>
  147. VariantUtils.ConvertToRect2((godot_variant)NativeVar);
  148. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  149. public Rect2i AsRect2i() =>
  150. VariantUtils.ConvertToRect2i((godot_variant)NativeVar);
  151. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  152. public Transform2D AsTransform2D() =>
  153. VariantUtils.ConvertToTransform2D((godot_variant)NativeVar);
  154. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  155. public Vector3 AsVector3() =>
  156. VariantUtils.ConvertToVector3((godot_variant)NativeVar);
  157. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  158. public Vector3i AsVector3i() =>
  159. VariantUtils.ConvertToVector3i((godot_variant)NativeVar);
  160. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  161. public Basis AsBasis() =>
  162. VariantUtils.ConvertToBasis((godot_variant)NativeVar);
  163. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  164. public Quaternion AsQuaternion() =>
  165. VariantUtils.ConvertToQuaternion((godot_variant)NativeVar);
  166. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  167. public Transform3D AsTransform3D() =>
  168. VariantUtils.ConvertToTransform3D((godot_variant)NativeVar);
  169. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  170. public Vector4 AsVector4() =>
  171. VariantUtils.ConvertToVector4((godot_variant)NativeVar);
  172. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  173. public Vector4i AsVector4i() =>
  174. VariantUtils.ConvertToVector4i((godot_variant)NativeVar);
  175. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  176. public Projection AsProjection() =>
  177. VariantUtils.ConvertToProjection((godot_variant)NativeVar);
  178. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  179. public AABB AsAABB() =>
  180. VariantUtils.ConvertToAABB((godot_variant)NativeVar);
  181. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  182. public Color AsColor() =>
  183. VariantUtils.ConvertToColor((godot_variant)NativeVar);
  184. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  185. public Plane AsPlane() =>
  186. VariantUtils.ConvertToPlane((godot_variant)NativeVar);
  187. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  188. public Callable AsCallable() =>
  189. VariantUtils.ConvertToCallableManaged((godot_variant)NativeVar);
  190. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  191. public SignalInfo AsSignalInfo() =>
  192. VariantUtils.ConvertToSignalInfo((godot_variant)NativeVar);
  193. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  194. public byte[] AsByteArray() =>
  195. VariantUtils.ConvertAsPackedByteArrayToSystemArray((godot_variant)NativeVar);
  196. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  197. public int[] AsInt32Array() =>
  198. VariantUtils.ConvertAsPackedInt32ArrayToSystemArray((godot_variant)NativeVar);
  199. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  200. public long[] AsInt64Array() =>
  201. VariantUtils.ConvertAsPackedInt64ArrayToSystemArray((godot_variant)NativeVar);
  202. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  203. public float[] AsFloat32Array() =>
  204. VariantUtils.ConvertAsPackedFloat32ArrayToSystemArray((godot_variant)NativeVar);
  205. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  206. public double[] AsFloat64Array() =>
  207. VariantUtils.ConvertAsPackedFloat64ArrayToSystemArray((godot_variant)NativeVar);
  208. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  209. public string[] AsStringArray() =>
  210. VariantUtils.ConvertAsPackedStringArrayToSystemArray((godot_variant)NativeVar);
  211. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  212. public Vector2[] AsVector2Array() =>
  213. VariantUtils.ConvertAsPackedVector2ArrayToSystemArray((godot_variant)NativeVar);
  214. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  215. public Vector3[] AsVector3Array() =>
  216. VariantUtils.ConvertAsPackedVector3ArrayToSystemArray((godot_variant)NativeVar);
  217. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  218. public Color[] AsColorArray() =>
  219. VariantUtils.ConvertAsPackedColorArrayToSystemArray((godot_variant)NativeVar);
  220. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  221. public T[] AsGodotObjectArray<T>()
  222. where T : Godot.Object =>
  223. VariantUtils.ConvertToSystemArrayOfGodotObject<T>((godot_variant)NativeVar);
  224. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  225. public Collections.Dictionary<TKey, TValue> AsGodotDictionary<TKey, TValue>() =>
  226. VariantUtils.ConvertToDictionaryObject<TKey, TValue>((godot_variant)NativeVar);
  227. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  228. public Collections.Array<T> AsGodotArray<T>() =>
  229. VariantUtils.ConvertToArrayObject<T>((godot_variant)NativeVar);
  230. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  231. public StringName[] AsSystemArrayOfStringName() =>
  232. VariantUtils.ConvertToSystemArrayOfStringName((godot_variant)NativeVar);
  233. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  234. public NodePath[] AsSystemArrayOfNodePath() =>
  235. VariantUtils.ConvertToSystemArrayOfNodePath((godot_variant)NativeVar);
  236. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  237. public RID[] AsSystemArrayOfRID() =>
  238. VariantUtils.ConvertToSystemArrayOfRID((godot_variant)NativeVar);
  239. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  240. public Godot.Object AsGodotObject() =>
  241. VariantUtils.ConvertToGodotObject((godot_variant)NativeVar);
  242. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  243. public StringName AsStringName() =>
  244. VariantUtils.ConvertToStringNameObject((godot_variant)NativeVar);
  245. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  246. public NodePath AsNodePath() =>
  247. VariantUtils.ConvertToNodePathObject((godot_variant)NativeVar);
  248. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  249. public RID AsRID() =>
  250. VariantUtils.ConvertToRID((godot_variant)NativeVar);
  251. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  252. public Collections.Dictionary AsGodotDictionary() =>
  253. VariantUtils.ConvertToDictionaryObject((godot_variant)NativeVar);
  254. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  255. public Collections.Array AsGodotArray() =>
  256. VariantUtils.ConvertToArrayObject((godot_variant)NativeVar);
  257. // Explicit conversion operators to supported types
  258. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  259. public static explicit operator bool(Variant from) => from.AsBool();
  260. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  261. public static explicit operator char(Variant from) => from.AsChar();
  262. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  263. public static explicit operator sbyte(Variant from) => from.AsSByte();
  264. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  265. public static explicit operator short(Variant from) => from.AsInt16();
  266. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  267. public static explicit operator int(Variant from) => from.AsInt32();
  268. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  269. public static explicit operator long(Variant from) => from.AsInt64();
  270. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  271. public static explicit operator byte(Variant from) => from.AsByte();
  272. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  273. public static explicit operator ushort(Variant from) => from.AsUInt16();
  274. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  275. public static explicit operator uint(Variant from) => from.AsUInt32();
  276. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  277. public static explicit operator ulong(Variant from) => from.AsUInt64();
  278. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  279. public static explicit operator float(Variant from) => from.AsSingle();
  280. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  281. public static explicit operator double(Variant from) => from.AsDouble();
  282. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  283. public static explicit operator string(Variant from) => from.AsString();
  284. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  285. public static explicit operator Vector2(Variant from) => from.AsVector2();
  286. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  287. public static explicit operator Vector2i(Variant from) => from.AsVector2i();
  288. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  289. public static explicit operator Rect2(Variant from) => from.AsRect2();
  290. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  291. public static explicit operator Rect2i(Variant from) => from.AsRect2i();
  292. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  293. public static explicit operator Transform2D(Variant from) => from.AsTransform2D();
  294. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  295. public static explicit operator Vector3(Variant from) => from.AsVector3();
  296. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  297. public static explicit operator Vector3i(Variant from) => from.AsVector3i();
  298. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  299. public static explicit operator Basis(Variant from) => from.AsBasis();
  300. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  301. public static explicit operator Quaternion(Variant from) => from.AsQuaternion();
  302. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  303. public static explicit operator Transform3D(Variant from) => from.AsTransform3D();
  304. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  305. public static explicit operator Vector4(Variant from) => from.AsVector4();
  306. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  307. public static explicit operator Vector4i(Variant from) => from.AsVector4i();
  308. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  309. public static explicit operator Projection(Variant from) => from.AsProjection();
  310. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  311. public static explicit operator AABB(Variant from) => from.AsAABB();
  312. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  313. public static explicit operator Color(Variant from) => from.AsColor();
  314. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  315. public static explicit operator Plane(Variant from) => from.AsPlane();
  316. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  317. public static explicit operator Callable(Variant from) => from.AsCallable();
  318. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  319. public static explicit operator SignalInfo(Variant from) => from.AsSignalInfo();
  320. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  321. public static explicit operator byte[](Variant from) => from.AsByteArray();
  322. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  323. public static explicit operator int[](Variant from) => from.AsInt32Array();
  324. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  325. public static explicit operator long[](Variant from) => from.AsInt64Array();
  326. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  327. public static explicit operator float[](Variant from) => from.AsFloat32Array();
  328. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  329. public static explicit operator double[](Variant from) => from.AsFloat64Array();
  330. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  331. public static explicit operator string[](Variant from) => from.AsStringArray();
  332. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  333. public static explicit operator Vector2[](Variant from) => from.AsVector2Array();
  334. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  335. public static explicit operator Vector3[](Variant from) => from.AsVector3Array();
  336. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  337. public static explicit operator Color[](Variant from) => from.AsColorArray();
  338. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  339. public static explicit operator StringName[](Variant from) => from.AsSystemArrayOfStringName();
  340. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  341. public static explicit operator NodePath[](Variant from) => from.AsSystemArrayOfNodePath();
  342. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  343. public static explicit operator RID[](Variant from) => from.AsSystemArrayOfRID();
  344. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  345. public static explicit operator Godot.Object(Variant from) => from.AsGodotObject();
  346. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  347. public static explicit operator StringName(Variant from) => from.AsStringName();
  348. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  349. public static explicit operator NodePath(Variant from) => from.AsNodePath();
  350. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  351. public static explicit operator RID(Variant from) => from.AsRID();
  352. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  353. public static explicit operator Collections.Dictionary(Variant from) => from.AsGodotDictionary();
  354. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  355. public static explicit operator Collections.Array(Variant from) => from.AsGodotArray();
  356. // While we provide implicit conversion operators, normal methods are still needed for
  357. // casts that are not done implicitly (e.g.: raw array to Span, enum to integer, etc).
  358. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  359. public static Variant CreateFrom(bool from) => from;
  360. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  361. public static Variant CreateFrom(char from) => from;
  362. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  363. public static Variant CreateFrom(sbyte from) => from;
  364. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  365. public static Variant CreateFrom(short from) => from;
  366. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  367. public static Variant CreateFrom(int from) => from;
  368. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  369. public static Variant CreateFrom(long from) => from;
  370. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  371. public static Variant CreateFrom(byte from) => from;
  372. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  373. public static Variant CreateFrom(ushort from) => from;
  374. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  375. public static Variant CreateFrom(uint from) => from;
  376. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  377. public static Variant CreateFrom(ulong from) => from;
  378. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  379. public static Variant CreateFrom(float from) => from;
  380. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  381. public static Variant CreateFrom(double from) => from;
  382. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  383. public static Variant CreateFrom(string from) => from;
  384. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  385. public static Variant CreateFrom(Vector2 from) => from;
  386. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  387. public static Variant CreateFrom(Vector2i from) => from;
  388. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  389. public static Variant CreateFrom(Rect2 from) => from;
  390. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  391. public static Variant CreateFrom(Rect2i from) => from;
  392. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  393. public static Variant CreateFrom(Transform2D from) => from;
  394. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  395. public static Variant CreateFrom(Vector3 from) => from;
  396. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  397. public static Variant CreateFrom(Vector3i from) => from;
  398. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  399. public static Variant CreateFrom(Basis from) => from;
  400. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  401. public static Variant CreateFrom(Quaternion from) => from;
  402. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  403. public static Variant CreateFrom(Transform3D from) => from;
  404. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  405. public static Variant CreateFrom(Vector4 from) => from;
  406. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  407. public static Variant CreateFrom(Vector4i from) => from;
  408. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  409. public static Variant CreateFrom(Projection from) => from;
  410. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  411. public static Variant CreateFrom(AABB from) => from;
  412. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  413. public static Variant CreateFrom(Color from) => from;
  414. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  415. public static Variant CreateFrom(Plane from) => from;
  416. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  417. public static Variant CreateFrom(Callable from) => from;
  418. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  419. public static Variant CreateFrom(SignalInfo from) => from;
  420. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  421. public static Variant CreateFrom(Span<byte> from) => from;
  422. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  423. public static Variant CreateFrom(Span<int> from) => from;
  424. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  425. public static Variant CreateFrom(Span<long> from) => from;
  426. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  427. public static Variant CreateFrom(Span<float> from) => from;
  428. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  429. public static Variant CreateFrom(Span<double> from) => from;
  430. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  431. public static Variant CreateFrom(Span<string> from) => from;
  432. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  433. public static Variant CreateFrom(Span<Vector2> from) => from;
  434. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  435. public static Variant CreateFrom(Span<Vector3> from) => from;
  436. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  437. public static Variant CreateFrom(Span<Color> from) => from;
  438. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  439. public static Variant CreateFrom(Godot.Object[] from) => from;
  440. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  441. public static Variant CreateFrom<TKey, TValue>(Collections.Dictionary<TKey, TValue> from) =>
  442. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromDictionary(from));
  443. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  444. public static Variant CreateFrom<T>(Collections.Array<T> from) =>
  445. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromArray(from));
  446. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  447. public static Variant CreateFrom(Span<StringName> from) => from;
  448. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  449. public static Variant CreateFrom(Span<NodePath> from) => from;
  450. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  451. public static Variant CreateFrom(Span<RID> from) => from;
  452. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  453. public static Variant CreateFrom(Godot.Object from) => from;
  454. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  455. public static Variant CreateFrom(StringName from) => from;
  456. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  457. public static Variant CreateFrom(NodePath from) => from;
  458. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  459. public static Variant CreateFrom(RID from) => from;
  460. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  461. public static Variant CreateFrom(Collections.Dictionary from) => from;
  462. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  463. public static Variant CreateFrom(Collections.Array from) => from;
  464. // Implicit conversion operators
  465. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  466. public static implicit operator Variant(bool from) =>
  467. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromBool(from));
  468. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  469. public static implicit operator Variant(char from) =>
  470. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  471. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  472. public static implicit operator Variant(sbyte from) =>
  473. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  474. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  475. public static implicit operator Variant(short from) =>
  476. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  477. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  478. public static implicit operator Variant(int from) =>
  479. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  480. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  481. public static implicit operator Variant(long from) =>
  482. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  483. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  484. public static implicit operator Variant(byte from) =>
  485. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  486. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  487. public static implicit operator Variant(ushort from) =>
  488. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  489. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  490. public static implicit operator Variant(uint from) =>
  491. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  492. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  493. public static implicit operator Variant(ulong from) =>
  494. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromInt(from));
  495. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  496. public static implicit operator Variant(float from) =>
  497. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromFloat(from));
  498. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  499. public static implicit operator Variant(double from) =>
  500. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromFloat(from));
  501. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  502. public static implicit operator Variant(string from) =>
  503. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromString(from));
  504. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  505. public static implicit operator Variant(Vector2 from) =>
  506. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector2(from));
  507. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  508. public static implicit operator Variant(Vector2i from) =>
  509. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector2i(from));
  510. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  511. public static implicit operator Variant(Rect2 from) =>
  512. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromRect2(from));
  513. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  514. public static implicit operator Variant(Rect2i from) =>
  515. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromRect2i(from));
  516. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  517. public static implicit operator Variant(Transform2D from) =>
  518. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromTransform2D(from));
  519. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  520. public static implicit operator Variant(Vector3 from) =>
  521. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector3(from));
  522. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  523. public static implicit operator Variant(Vector3i from) =>
  524. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector3i(from));
  525. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  526. public static implicit operator Variant(Basis from) =>
  527. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromBasis(from));
  528. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  529. public static implicit operator Variant(Quaternion from) =>
  530. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromQuaternion(from));
  531. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  532. public static implicit operator Variant(Transform3D from) =>
  533. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromTransform3D(from));
  534. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  535. public static implicit operator Variant(Vector4 from) =>
  536. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector4(from));
  537. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  538. public static implicit operator Variant(Vector4i from) =>
  539. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromVector4i(from));
  540. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  541. public static implicit operator Variant(Projection from) =>
  542. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromProjection(from));
  543. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  544. public static implicit operator Variant(AABB from) =>
  545. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromAABB(from));
  546. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  547. public static implicit operator Variant(Color from) =>
  548. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromColor(from));
  549. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  550. public static implicit operator Variant(Plane from) =>
  551. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPlane(from));
  552. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  553. public static implicit operator Variant(Callable from) =>
  554. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromCallable(from));
  555. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  556. public static implicit operator Variant(SignalInfo from) =>
  557. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSignalInfo(from));
  558. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  559. public static implicit operator Variant(Span<byte> from) =>
  560. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedByteArray(from));
  561. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  562. public static implicit operator Variant(Span<int> from) =>
  563. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedInt32Array(from));
  564. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  565. public static implicit operator Variant(Span<long> from) =>
  566. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedInt64Array(from));
  567. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  568. public static implicit operator Variant(Span<float> from) =>
  569. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedFloat32Array(from));
  570. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  571. public static implicit operator Variant(Span<double> from) =>
  572. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedFloat64Array(from));
  573. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  574. public static implicit operator Variant(Span<string> from) =>
  575. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedStringArray(from));
  576. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  577. public static implicit operator Variant(Span<Vector2> from) =>
  578. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedVector2Array(from));
  579. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  580. public static implicit operator Variant(Span<Vector3> from) =>
  581. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedVector3Array(from));
  582. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  583. public static implicit operator Variant(Span<Color> from) =>
  584. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromPackedColorArray(from));
  585. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  586. public static implicit operator Variant(Godot.Object[] from) =>
  587. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSystemArrayOfGodotObject(from));
  588. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  589. public static implicit operator Variant(Span<StringName> from) =>
  590. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSystemArrayOfStringName(from));
  591. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  592. public static implicit operator Variant(Span<NodePath> from) =>
  593. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSystemArrayOfNodePath(from));
  594. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  595. public static implicit operator Variant(Span<RID> from) =>
  596. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSystemArrayOfRID(from));
  597. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  598. public static implicit operator Variant(Godot.Object from) =>
  599. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromGodotObject(from));
  600. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  601. public static implicit operator Variant(StringName from) =>
  602. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromStringName(from));
  603. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  604. public static implicit operator Variant(NodePath from) =>
  605. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromNodePath(from));
  606. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  607. public static implicit operator Variant(RID from) =>
  608. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromRID(from));
  609. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  610. public static implicit operator Variant(Collections.Dictionary from) =>
  611. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromDictionary(from));
  612. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  613. public static implicit operator Variant(Collections.Array from) =>
  614. CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromArray(from));
  615. }