123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- using System;
- namespace UnityEngine.InputSystem.Utilities
- {
- /// <summary>
- /// A four-character code.
- /// </summary>
- /// <remarks>
- /// A four-character code is a struct containing four byte characters totalling a single <c>int</c>.
- /// FourCCs are frequently used in the input system to identify the format of data sent to or from
- /// the native backend representing events, input device state or commands sent to input devices.
- /// </remarks>
- public struct FourCC : IEquatable<FourCC>
- {
- private int m_Code;
- /// <summary>
- /// Create a FourCC from the given integer.
- /// </summary>
- /// <param name="code">FourCC code represented as an <c>int</c>. Character order is
- /// little endian. "ABCD" is stored with A in the highest order 8 bits and D in the
- /// lowest order 8 bits.</param>
- /// <remarks>
- /// This method does not actually verify whether the four characters in the code
- /// are printable.
- /// </remarks>
- public FourCC(int code)
- {
- m_Code = code;
- }
- /// <summary>
- /// Create a FourCC from the given four characters.
- /// </summary>
- /// <param name="a">First character.</param>
- /// <param name="b">Second character.</param>
- /// <param name="c">Third character.</param>
- /// <param name="d">Fourth character.</param>
- public FourCC(char a, char b = ' ', char c = ' ', char d = ' ')
- {
- m_Code = (a << 24) | (b << 16) | (c << 8) | d;
- }
- /// <summary>
- /// Create a FourCC from the given string.
- /// </summary>
- /// <param name="str">A string with four characters or less but with at least one character.</param>
- /// <exception cref="ArgumentException"><paramref name="str"/> is empty or has more than four characters.</exception>
- /// <exception cref="ArgumentNullException"><paramref name="str"/> is <c>null</c>.</exception>
- public FourCC(string str)
- : this()
- {
- if (str == null)
- throw new ArgumentNullException(nameof(str));
- var length = str.Length;
- if (length < 1 || length > 4)
- throw new ArgumentException("FourCC string must be one to four characters long!", nameof(str));
- var a = str[0];
- var b = length > 1 ? str[1] : ' ';
- var c = length > 2 ? str[2] : ' ';
- var d = length > 3 ? str[3] : ' ';
- m_Code = (a << 24) | (b << 16) | (c << 8) | d;
- }
- /// <summary>
- /// Convert the given FourCC into an <c>int</c>.
- /// </summary>
- /// <param name="fourCC">A FourCC.</param>
- /// <returns>The four characters of the code packed into one <c>int</c>. Character order is
- /// little endian. "ABCD" is stored with A in the highest order 8 bits and D in the
- /// lowest order 8 bits.</returns>
- public static implicit operator int(FourCC fourCC)
- {
- return fourCC.m_Code;
- }
- /// <summary>
- /// Convert the given <c>int</c> into a FourCC.
- /// </summary>
- /// <param name="i">FourCC code represented as an <c>int</c>. Character order is
- /// little endian. "ABCD" is stored with A in the highest order 8 bits and D in the
- /// lowest order 8 bits.</param>
- /// <returns>The FourCC converted from <paramref name="i"/>.</returns>
- public static implicit operator FourCC(int i)
- {
- return new FourCC(i);
- }
- /// <summary>
- /// Convert the FourCC into a string in the form of "ABCD".
- /// </summary>
- /// <returns>String representation of the FourCC.</returns>
- public override string ToString()
- {
- return
- $"{(char) (m_Code >> 24)}{(char) ((m_Code & 0xff0000) >> 16)}{(char) ((m_Code & 0xff00) >> 8)}{(char) (m_Code & 0xff)}";
- }
- /// <summary>
- /// Compare two FourCCs for equality.
- /// </summary>
- /// <param name="other">Another FourCC.</param>
- /// <returns>True if the two FourCCs are equal, i.e. have the same exact
- /// character codes.</returns>
- public bool Equals(FourCC other)
- {
- return m_Code == other.m_Code;
- }
- /// <summary>
- /// Compare the FourCC to the given object.
- /// </summary>
- /// <param name="obj">An object. Can be null.</param>
- /// <returns>True if <paramref name="obj"/> is a FourCC that has the same
- /// character code sequence.</returns>
- public override bool Equals(object obj)
- {
- if (ReferenceEquals(null, obj))
- return false;
- return obj is FourCC cc && Equals(cc);
- }
- /// <summary>
- /// Compute a hash code for the FourCC.
- /// </summary>
- /// <returns>Simply returns the FourCC converted to an <c>int</c>.</returns>
- public override int GetHashCode()
- {
- return m_Code;
- }
- /// <summary>
- /// Compare two FourCCs for equality.
- /// </summary>
- /// <param name="left">First FourCC.</param>
- /// <param name="right">Second FourCC.</param>
- /// <returns>True if the two FourCCs are equal, i.e. have the same exact
- /// character codes.</returns>
- public static bool operator==(FourCC left, FourCC right)
- {
- return left.m_Code == right.m_Code;
- }
- /// <summary>
- /// Compare two FourCCs for inequality.
- /// </summary>
- /// <param name="left">First FourCC.</param>
- /// <param name="right">Second FourCC.</param>
- /// <returns>True if the two FourCCs are not equal, i.e. do not have the same exact
- /// character codes.</returns>
- public static bool operator!=(FourCC left, FourCC right)
- {
- return left.m_Code != right.m_Code;
- }
- // Make annoying Microsoft code analyzer happy.
- public static FourCC FromInt32(int i)
- {
- return i;
- }
- public static int ToInt32(FourCC fourCC)
- {
- return fourCC.m_Code;
- }
- }
- }
|