using System.Collections.Generic; using System.Runtime.InteropServices; using System; namespace YKMoon.Math { /// /// Custom int mask like unity layoutmask. /// [StructLayout(LayoutKind.Sequential)] public struct IntMask { private int m_Mask; public static implicit operator int(IntMask mask) { return mask.m_Mask; } public static implicit operator IntMask(int intVal) { IntMask mask; mask.m_Mask = intVal; return mask; } public int value { get { return this.m_Mask; } set { this.m_Mask = value; } } public void Set(int pos, bool value) { if (value) { this.m_Mask |= 1 << pos; } else { this.m_Mask &= ~(1 << pos); } } public static int GetMask(params int[] values) { if (values == null) { throw new ArgumentNullException("values"); } int num = 0; for(int i=0; i values) { if(values == null) { throw new ArgumentNullException("values"); } int num = 0; for(int i = 0; i < values.Count; i++) { int intval = values[i]; if(intval != -1) { num |= 1 << intval; } } return num; } public bool Contains(int layer) { return ((m_Mask & (1 << layer)) > 0); } } }