public SimpleCompExKeyMan(SimpleLevel2KeyMan level2KeyMan) { Level2KeyMan = level2KeyMan ?? throw new ArgumentNullException($"{nameof(level2KeyMan)}."); MaxPropsPerObject = level2KeyMan.MaxPropsPerObject; double numBitsForProps = Math.Log(MaxPropsPerObject, 2); if ((int)numBitsForProps - numBitsForProps > 0.5) { throw new ArgumentException("The maxPropsPerObject must be an even power of two. For example: 256, 512, 1024, etc."); } int numberOfBitsInCKey = (int)Math.Log(CompositeKeyType.MaxValue, 2); double topRange = numberOfBitsInCKey - 2; // Must leave room for at least 4 objects. if (4 > numBitsForProps || numBitsForProps > topRange) { throw new ArgumentException($"maxPropsPerObject must be between 4 and {topRange}, inclusive.", nameof(level2KeyMan.MaxPropsPerObject)); } int numberOfTopBits = (int)Math.Round((double)numberOfBitsInCKey - numBitsForProps, 0); MaxObjectsPerAppDomain = (long)Math.Pow(2, numberOfTopBits); _shift = numberOfTopBits; _botFieldLen = numberOfBitsInCKey - numberOfTopBits; _botMask = ((CompositeKeyType)1 << _botFieldLen) - 1; _topMask = ((CompositeKeyType)1 << numberOfTopBits) - 1; }
public SimpleLevel2KeyMan(SimpleLevel2KeyMan sourceToCopy) { MaxPropsPerObject = sourceToCopy.MaxPropsPerObject; _sync = new object(); _rawDict = new Dictionary <PropNameType, PropIdType>(sourceToCopy._rawDict); _cookedDict = new Dictionary <PropIdType, PropNameType>(sourceToCopy._cookedDict); }