Пример #1
0
        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;
        }
Пример #2
0
        public SimpleLevel2KeyMan(SimpleLevel2KeyMan sourceToCopy)
        {
            MaxPropsPerObject = sourceToCopy.MaxPropsPerObject;

            _sync = new object();


            _rawDict    = new Dictionary <PropNameType, PropIdType>(sourceToCopy._rawDict);
            _cookedDict = new Dictionary <PropIdType, PropNameType>(sourceToCopy._cookedDict);
        }