1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | // // IntCollection.cs // // Author: // toadicus <> // // Copyright (c) 2013 toadicus // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. using System; namespace VOID { public class IntCollection { public static implicit operator long(IntCollection c) { return c.collection; } protected long mask; public long collection { get; protected set; } public ushort maxCount { get; protected set; } public ushort wordLength { get; protected set; } public IntCollection (ushort wordLength = 4, long initialCollection = 0) { this.collection = initialCollection; this.wordLength = wordLength; this.maxCount = (ushort)((sizeof(long) * 8 - 1) / wordLength); this.mask = ((1 << this.wordLength) - 1); } public ushort this[int idx] { get { if (idx < 0) { idx += this.maxCount; } if (idx >= maxCount || idx < 0) { throw new IndexOutOfRangeException (); } idx *= wordLength; return (ushort)((this.collection & (this.mask << idx)) >> idx); } set { if (idx < 0) { idx += this.maxCount; } if (idx >= maxCount || idx < 0) { throw new IndexOutOfRangeException (); } idx *= wordLength; long packvalue = value & this.mask; this.collection &= ~(this.mask << idx); this.collection |= packvalue << idx; } } } } |