Esempio n. 1
0
        public void CouldAddVariantSeries()
        {
            var sm = new SortedMap <int, double>();

            for (int i = 0; i < 100; i++)
            {
                sm.Add(i, (i * 100));
            }

            var vs = new VariantSeries <int, double>(sm);

            var doubled = vs + vs;

            foreach (var item in doubled)
            {
                System.Console.WriteLine(item.Key.Get <int>() + ": " + item.Value.Get <double>());
            }

            Assert.AreEqual(Variant.Create(0), doubled.First.Key);
            Assert.AreEqual(Variant.Create(0.0), doubled.First.Value);
            Assert.AreEqual(Variant.Create(99), doubled.Last.Key);
            Assert.AreEqual(Variant.Create(9900.0 * 2), doubled.Last.Value);


            var cursorSeries = doubled.ReadOnly();

            Assert.AreEqual(Variant.Create(0), cursorSeries.First.Key);
        }
Esempio n. 2
0
        private string GetText()
        {
            Variant value = Variant.Create();

            TextView_c.GetValue(Pointer, value.Pointer);
            return(value.AsString());
        }
Esempio n. 3
0
        public void CouldCreateAndReadBool()
        {
            var b = Variant.Create(true);

            Assert.AreEqual(TypeEnum.Bool, b.TypeEnum);
            Assert.AreEqual(true, b.Get <bool>());
        }
Esempio n. 4
0
        private float GetValue()
        {
            Variant value = Variant.Create();

            PowerBarView_c.GetValue(Pointer, value.Pointer);
            return(value.AsFloat());
        }
Esempio n. 5
0
        public void CouldReadVariantSeries()
        {
            var sm = new SortedMap <int, string>();

            for (int i = 0; i < 100; i++)
            {
                sm.Add(i, (i * 100).ToString());
            }

            var vs = new VariantSeries <int, string>(sm);


            foreach (var item in vs)
            {
                System.Console.WriteLine(item.Key.Get <int>() + ": " + item.Value.Get <string>());
            }

            Assert.AreEqual(Variant.Create(0), vs.First.Key);
            Assert.AreEqual(Variant.Create("0"), vs.First.Value);
            Assert.AreEqual(Variant.Create(99), vs.Last.Key);
            Assert.AreEqual(Variant.Create("9900"), vs.Last.Value);


            var cursorSeries = new CursorSeries <int, string>(sm);

            Assert.AreEqual(0, cursorSeries.First.Key);
        }
Esempio n. 6
0
        private static View CreateMenu(Menu menu, ViewSelector viewSelector)
        {
            View view = menu.CreateView();

            viewSelector.GetListView().AppendItem(StringListViewItem.Create(Variant.Create(view.Handle), menu.Name, 216, 0));
            viewSelector.AppendView(view);

            return(view);
        }
Esempio n. 7
0
        public void ColumnTest()
        {
            var isFixedSize = TypeHelper <TestRow> .IsFixedSize;

            var count    = 100000;
            var accessor = TypeAccessor.Create(typeof(TestRow));
            var rows     = new TestRow[count];

            for (int i = 0; i < count; i++)
            {
                rows[i] = new TestRow
                {
                    Col1 = i,
                    Col2 = i,
                    Col3 = i,
                    //Col11 = i,
                    //Col21 = i,
                    //Col31 = i
                };
            }

            var memberSet = accessor.GetMembers();

            Array[]   arrays   = new Array[memberSet.Count];
            Variant[] variants = new Variant[memberSet.Count];

            var memberCount = memberSet.Count;

            for (int i = 0; i < memberCount; i++)
            {
                arrays[i] = Array.CreateInstance(memberSet[i].Type, count);
                var arr = arrays[i];
                variants[i] = Variant.Create(arr);
            }

            var names = memberSet.Select(m => m.Name).ToArray();

            for (int round = 0; round < 100; round++)
            {
                var sw = new Stopwatch();
                sw.Restart();

                for (var r = 0; r < count; r++)
                {
                    for (var c = 0; c < memberCount; c++)
                    {
                        var value = accessor[rows[r], names[c]];
                        //arrays[c].SetValue(value, r);
                        variants[c][r] = Variant.Create(value); // almost 4x slower
                    }
                }

                sw.Stop();

                Console.WriteLine($"To columns: {sw.ElapsedMilliseconds} msec");
            }
        }
Esempio n. 8
0
        public async void RangeOnVariantSeriesWorks()
        {
            var sm = new SortedMap <DateTime, int>();

            for (int i = 0; i < 100; i++)
            {
                sm.Add(DateTime.Today.AddSeconds(i), i);
            }

            var vs = new VariantSeries <DateTime, int>(sm);

            Assert.IsTrue(!vs.Comparer.Equals(KeyComparer <Variant> .Default));

            var rs = vs.After(Variant.Create(DateTime.Today.AddSeconds(50)));

            Assert.IsTrue(!rs.Comparer.Equals(KeyComparer <Variant> .Default));

            var expected = 0;

            for (int i = 50; i < 100; i++)
            {
                expected += i;
            }

            var sum = 0;

            foreach (var variantKvp in rs)
            {
                sum += variantKvp.Value.Get <int>();
            }
            Assert.AreEqual(expected, sum);


            var t = Task.Run(async() =>
            {
                try
                {
                    for (int i = 100; i < 150; i++)
                    {
                        sm.Add(DateTime.Today.AddSeconds(i), i);
                        await Task.Delay(1);
                    }
                    sm.Complete();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            });
            var c = rs.GetCursor();

            while (await c.MoveNext(CancellationToken.None))
            {
                sum += c.CurrentValue.Get <int>();
            }
        }
Esempio n. 9
0
        private unsafe bool GetIsChecked()
        {
            Variant pOutput = Variant.Create(0);
            IntPtr  what    = CheckBox_c.GetValue(_pointer, pOutput.Pointer);
            bool    result  = Variant.FromPointer(what).AsInt32() == 1;

            pOutput.Dispose();

            return(result);
        }
Esempio n. 10
0
        public void CouldCreateAndReadErrorCode()
        {
            var variant = Variant.Create(new ErrorCode {
                Code = 123456789
            });

            Assert.AreEqual(TypeEnum.ErrorCode, variant.TypeEnum);
            Assert.AreEqual(123456789, variant.Get <ErrorCode>().Code);
            var obj = variant.ToObject();

            Assert.AreEqual(typeof(ErrorCode), obj.GetType());
        }
Esempio n. 11
0
        public void CouldJsonConvertVariantWithCustomObject()
        {
            var variant = Variant.Create(new TestKnownType {
                Int = 123, Str = "str"
            });
            var json = JsonConvert.SerializeObject(variant);

            Console.WriteLine(json);

            var variant2 = JsonConvert.DeserializeObject <Variant>(json);

            Assert.AreEqual(variant._object, variant2._object);
        }
Esempio n. 12
0
        public void CouldJsonConvertVariantArrayOfVariants()
        {
            var arrayVariant = Variant.Create(new Variant[] { Variant.Create(123), Variant.Create(456.7) });
            var json         = JsonConvert.SerializeObject(arrayVariant);

            Console.WriteLine(json);

            var arrayVariant2 = JsonConvert.DeserializeObject <Variant>(json);

            Assert.AreEqual(123, arrayVariant2[0].Get <int>());
            Assert.AreEqual(123, arrayVariant2[0].Get <int>(0));
            Assert.AreEqual(456.7, arrayVariant2[1].Get <double>());
            Assert.AreEqual(456.7, arrayVariant2[1].Get <double>(0));
        }
Esempio n. 13
0
        public void CouldSerializeTable()
        {
            var sw = new Stopwatch();

            sw.Restart();
            var rows    = 100;
            var columns = 100;
            var data    = new Variant[rows, columns];

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    data[i, j] = Variant.Create(i * j);
                }
            }

            var table = new Table(data);

            sw.Stop();
            Console.WriteLine($"Elapsed create: {sw.ElapsedMilliseconds}");
            sw.Restart();

            sw.Stop();
            Console.WriteLine($"Elapsed snapshot: {sw.ElapsedMilliseconds}");
            sw.Restart();

            MemoryStream tmp;
            var          len = BinarySerializer.SizeOf(table, out tmp);

            Console.WriteLine($"Binary size: {len}");
            //var mem = BufferPool<byte>.Rent(len);
            //BinarySerializer.Write(table, mem, 0, tmp);

            sw.Stop();
            Console.WriteLine($"Elapsed serialize: {sw.ElapsedMilliseconds}");
            sw.Restart();

            //var str = JsonConvert.SerializeObject(table);
            //Console.WriteLine(str.Length);
            //Console.WriteLine(str);

            var delta = table.ToDelta(table);

            sw.Stop();
            Console.WriteLine($"Elapsed delta: {sw.ElapsedMilliseconds}");
            var str2 = JsonConvert.SerializeObject(delta);

            Console.WriteLine($"Delta length: {str2.Length} count: {delta.Cells.Count}");
        }
Esempio n. 14
0
        public void CouldJsonConvertVariantArrayOfVariantsWithString()
        {
            var arrayVariant       = Variant.Create(new Variant[] { Variant.Create(123), Variant.Create("456.7") });
            var arrayVariantNested = Variant.Create(new Variant[] { Variant.Create(arrayVariant), Variant.Create("456.7") });
            var json  = JsonConvert.SerializeObject(arrayVariant);
            var json2 = JsonConvert.SerializeObject(arrayVariantNested);

            Console.WriteLine(json);
            Console.WriteLine(json2);

            var arrayVariant2 = JsonConvert.DeserializeObject <Variant>(json);

            Assert.AreEqual(123, arrayVariant2[0].Get <int>());
            Assert.AreEqual(123, arrayVariant2[0].Get <int>(0));
            Assert.AreEqual("456.7", arrayVariant2[1].Get <string>());
            Assert.AreEqual("456.7", arrayVariant2[1].Get <string>(0));
        }
Esempio n. 15
0
        public void CouldCreateAndReadWriteArrayVariant()
        {
            var array = new double[2];

            array[0] = 123;
            array[1] = 456;

            var v = Variant.Create(array);

            Assert.AreEqual(TypeEnum.Array, v.TypeEnum);
            Assert.AreEqual(TypeEnum.Float64, v.ElementTypeEnum);
            Assert.AreEqual(8, v.ElementByteSize);
            Assert.AreEqual(2, v.Count);

            var boxedArray = (object)array;
            var v2         = Variant.Create(boxedArray);

            Assert.AreEqual(TypeEnum.Array, v2.TypeEnum);
            Assert.AreEqual(TypeEnum.Float64, v2.ElementTypeEnum);
            Assert.AreEqual(8, v2.ElementByteSize);
            Assert.AreEqual(2, v2.Count);

            var span = v2.Span <double>();

            Assert.AreEqual(123.0, span[0]);
            Assert.AreEqual(456.0, span[1]);
            Assert.AreEqual(2, span.Length);

            span[0] = 42;
            span[1] = 43;
            // array values are assigned via span
            Assert.AreEqual(42, array[0]);
            Assert.AreEqual(43, array[1]);

            var x = Variant.Create(44.0);

            Assert.AreEqual(TypeEnum.Float64, x.TypeEnum);
            v2[0] = x;
            v2[1] = Variant.Create(45.0);
            Assert.AreEqual(44, array[0]);
            Assert.AreEqual(45, array[1]);
        }
Esempio n. 16
0
    void testMSIBallErf()
    {
        try {
            ExternalComponentLibrary library = ErfContext.GetInstance().LoadComponentLibrary("MSIBallErf.dll");
            if (library == null)
            {
                Debug.LogError("Could not load MSIBallErf library");
                return;
            }
        } catch (Exception e)
        {
            Debug.Log(e.Message);
            return;
        }
        //init:
        ExternalExpert msiBallEmotionModel = ErfContext.GetInstance().FindExpert("MSIBallEmotionModel");
        CharacterModel playerModel         = new CharacterModel();

        playerModel.RegisterExpert(msiBallEmotionModel);


        //collision:
        EecEvent timeElapsedEvent = new EecEvent((int)GameEvent.STD_TIME_ELAPSED);

        timeElapsedEvent.AddValue("NO_OF_COLLISIONS", Variant.Create(2));
        timeElapsedEvent.AddValue("CURRENT_SPEED", Variant.Create(7.0f));
        playerModel.HandleEvent(timeElapsedEvent);

        //odpowiedz z erf
        float fear = playerModel.GetEmotionVector().GetValue(OccEmotions.FEAR).AsFloat();

        //przeliczenie na poziom trudnosci
        if (fear > 0.0f)
        {
            Debug.Log("FIRST I WAS AFRAID, I WAS PETRIFIED!");
        }
        else
        {
            Debug.Log("I AM FEARLESS! I AM DEATH! I AM FIRE!");
        }
    }
Esempio n. 17
0
        public void CouldCreateAndReadWriteInlinedVariant()
        {
            var v = Variant.Create(123.0);

            Assert.AreEqual(123.0, v.Get <double>());
            Assert.Throws <InvalidCastException>(() =>
            {
                v.Set(456); // no implicit conversion
            });
            v.Set(456.0);
            Assert.AreEqual(456.0, v.Get <double>());
            Assert.AreEqual(1, v.Count);

            // correctly parse boxed primitives
            var obj = (object)42.0;
            var v2  = Variant.Create(obj);

            Assert.AreEqual(v2.TypeEnum, TypeEnum.Float64);
            Assert.AreEqual(42.0, v2.Get <double>());
            Assert.AreEqual(1, v2.Count);

            var span = v2.Span <double>();

            Assert.AreEqual(42, span[0]);
            Assert.AreEqual(1, span.Length);
            span[0] = 43;
            Assert.AreEqual(43.0, v2.Get <double>());

            var x = Variant.Create(44.0);

            Assert.AreEqual(44.0, x.Get <double>());
            Assert.Throws <InvalidCastException>(() =>
            {
                v2[0] = Variant.Create(44); // no implicit conversion
            });
            v2[0] = Variant.Create(44.0);
            var v3 = v2[0];

            Assert.AreEqual(44.0, v3.Get <double>());
        }
Esempio n. 18
0
        public void CouldUseVariantJsonConverter()
        {
            var    variant = Variant.Create(123);
            string json    = JsonConvert.SerializeObject(variant);

            Console.WriteLine(json);

            var arrayVariant = Variant.Create(new[] { 123, 456 });
            var json2        = JsonConvert.SerializeObject(arrayVariant);

            Console.WriteLine(json2);

            var variant2 = JsonConvert.DeserializeObject <Variant>(json);

            Assert.AreEqual(123, variant2.Get <int>(0));
            Assert.AreEqual(123, variant2.Get <int>());

            var arrayVariant2 = JsonConvert.DeserializeObject <Variant>(json2);

            Assert.AreEqual(123, arrayVariant2.Get <int>(0));
            Assert.AreEqual(456, arrayVariant2.Get <int>(1));
        }
Esempio n. 19
0
        public void CouldCreateAndReadInlinedVariantInALoop()
        {
            var count = 100000000;
            var sw    = new Stopwatch();

            for (int round = 0; round < 10; round++)
            {
                sw.Restart();
                var sum = 0.0;
                for (int i = 0; i < count; i++)
                {
                    var v = Variant.Create <double>(i);
                    var d = v.Get <double>();
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }
            }
        }
Esempio n. 20
0
        public void CouldCreateAndReadInlinedVariantInALoop()
        {
            var count = 50000000;
            var sum   = 0.0;

            for (int round = 0; round < 10; round++)
            {
                using (Benchmark.Run("Variant", count))
                {
                    sum = 0.0;
                    for (int i = 0; i < count; i++)
                    {
                        var v = Variant.Create <double>(i);
                        var d = v.Get <double>();
                        sum += d;
                    }
                    if (sum == double.MaxValue)
                    {
                        ThrowHelper.ThrowInvalidOperationException();
                    }
                }
            }
            Benchmark.Dump();
        }
Esempio n. 21
0
 private void SetValue(float value)
 {
     PowerBarView_c.SetValue(Pointer, Variant.Create(value).Pointer, false);
 }
Esempio n. 22
0
 public override Variant ToKey2(TKey key)
 {
     return(Variant.Create(key));
 }
Esempio n. 23
0
 public override Variant ToValue2(TValue value)
 {
     return(Variant.Create(value));
 }
Esempio n. 24
0
    void FixedUpdate()
    {
        float fac;
        //transition scale
        float curScale = transform.localScale.x;
        float newScale = 0.05f * (targetScale - curScale) + curScale;

        transform.localScale = new Vector3(newScale, newScale, newScale);
        //
        if (gameSettings.gameMode == GameMode.EMOTIONAL)
        {
            //erf
            DateTime now = DateTime.Now;

            if ((now - lastReportTime).TotalMilliseconds >= interval)//czy należy rozpatrzeć zmianę emocji?
            {
                lastReportTime = now;
                //tutaj wysyłamy emocję
                EecEvent timeElapsedEvent = new EecEvent((int)GameEvent.STD_TIME_ELAPSED);
                timeElapsedEvent.AddValue("NO_OF_COLLISIONS", Variant.Create(scoreController.buffer.movingScore));
                timeElapsedEvent.AddValue("CURRENT_SPEED", Variant.Create(zSpeed));
                playerModel.HandleEvent(timeElapsedEvent);
                //odpowiedz z erf
                float fear = playerModel.GetEmotionVector().GetValue(OccEmotions.FEAR).AsFloat();
                //adaptacyjny zakres
                if (fear < minFear)
                {
                    minFear = fear;
                }
                else if (fear > maxFear)
                {
                    maxFear = fear;
                }

                float fearLength = maxFear - minFear;
                float fearRatio  = (fear - minFear) / fearLength;
                if (fearRatio < 0.1f)
                {
                    setDifficultyEnum(GameDifficulty.HARD);
                }
                else if (fearRatio < 0.4)
                {
                    setDifficultyEnum(GameDifficulty.MEDIUM);
                }
                else
                {
                    setDifficultyEnum(GameDifficulty.EASY);
                }
                Debug.LogFormat("ratio: {0} [{1}  -  {2}  -  {3}", fearRatio, minFear, fear, maxFear);
            }
        }
        else
        {
            //nie zmieniamy poziomu trudności
        }

        if (Input.GetKeyDown("escape"))//wychodzimy do menu?
        {
            Application.LoadLevel("MainMenuScene");
        }


        //obsługa poruszania kulą przez użytkownika
        float moveHorizontal = Input.GetAxis("Horizontal");

        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal / difficulty, 0.0f, zSpeed);

        rb.AddForce(movement * speed);
        distanceTraveled = transform.localPosition.z;
        updateSpeed();
    }
Esempio n. 25
0
        public void CouldCreateWriteReadInlinedVariantInALoop()
        {
            var count = 100000000;
            var sw    = new Stopwatch();

            for (int round = 0; round < 10; round++)
            {
                sw.Restart();
                var sum = 0.0;
                var v   = Variant.Create <double>(0.0);
                for (int i = 0; i < count; i++)
                {
                    v.Set <double>(i);
                    var d = v.Get <double>();
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Variant Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                for (int i = 0; i < count; i++)
                {
                    v.UnsafeSetInlined <double>(i);
                    var d = v.UnsafeGetInilned <double>();
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Unsafe Variant Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                for (int i = 0; i < count; i++)
                {
                    var span = v.Span <double>();
                    span[0] = i;
                    var d = span[0];
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Span (Inline) Variant Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                var v2 = Variant.Create <double>(new[] { 0.0 });
                sw.Restart();
                for (int i = 0; i < count; i++)
                {
                    var span = v2.Span <double>();
                    span[0] = i;
                    var d = span[0];
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Span (Array) Variant Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                for (int i = 0; i < count; i++)
                {
                    v2.Set <double>(0, 0.0);
                    var d = v2.Get <double>(0);
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Get/Set(idx) Variant Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                sum = 0.0;
                var array = new[] { 0.0 };
                for (int i = 0; i < count; i++)
                {
                    array[0] = i;
                    var d = array[0];
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue && array[0] > 0)
                {
                    Console.WriteLine($"Array Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                sum = 0.0;
                var container = new Container <double>();
                for (int i = 0; i < count; i++)
                {
                    container.Value = i;
                    var d = container.Value;
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue && container.Value > 0)
                {
                    Console.WriteLine($"Inlined Property Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                sum = 0.0;
                var dummyContainer = new DummyContainer <double>();
                for (int i = 0; i < count; i++)
                {
                    dummyContainer.Value = i;
                    var d = dummyContainer.Value;
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue && dummyContainer.Value > 0)
                {
                    Console.WriteLine($"Noninlined Property Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                sum = 0.0;
                var boxed = new BoxedContainer();
                for (int i = 0; i < count; i++)
                {
                    boxed.Value = (double)i;
                    var d = (double)boxed.Value;
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Inlined Boxed Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                sw.Restart();
                sum = 0.0;
                var boxedDummy = new BoxedDummyContainer();
                for (int i = 0; i < count; i++)
                {
                    boxedDummy.Value = (double)i;
                    var d = (double)boxed.Value;
                    sum += d;
                }
                sw.Stop();
                if (sum < double.MaxValue)
                {
                    Console.WriteLine($"Noninlined Boxed Elapsed: {sw.ElapsedMilliseconds}, Mops: {count / (sw.ElapsedMilliseconds * 0.001)}");
                }

                Console.WriteLine("---------------------------------");
            }
        }
Esempio n. 26
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return(Variant.FromObject(null));
            }
            if (reader.TokenType != JsonToken.StartArray)
            {
                throw new Exception("Invalid JSON for Variant type");
            }

            var codeValue = reader.ReadAsInt32();

            Debug.Assert(codeValue != null, "codeValue != null");
            var      typeCode    = (TypeEnum)(byte)codeValue;
            TypeEnum subTypeCode = TypeEnum.None;

            if (typeCode == TypeEnum.Array)
            {
                var subTypeCodeValue = reader.ReadAsInt32();
                Debug.Assert(subTypeCodeValue != null, "subTypeCodeValue != null");
                subTypeCode = (TypeEnum)(byte)subTypeCodeValue;
                if (subTypeCode == TypeEnum.FixedBinary)
                {
                    throw new NotImplementedException("Need special handling of fixed binary values");
                }
            }

            if (typeCode == TypeEnum.FixedBinary)
            {
                //var size = reader.ReadAsInt32();
                throw new NotImplementedException("Need special handling of fixed binary values");
            }

            object obj;

            if (typeCode == TypeEnum.Object)
            {
                var objectTypeCodeValue = reader.ReadAsInt32();
                Debug.Assert(objectTypeCodeValue != null, "objectTypeCodeValue != null");
                var objectTypeCode = (byte)objectTypeCodeValue;
                var type           = KnownTypeAttribute.GetType(objectTypeCode);
                if (!reader.Read())
                {
                    throw new Exception("Cannot read JSON");
                }
                obj = serializer.Deserialize(reader, type);
            }
            else if (typeCode != TypeEnum.None)
            {
                if (!reader.Read())
                {
                    throw new Exception("Cannot read JSON");
                }
                var type = VariantHelper.GetType(typeCode, subTypeCode);
                obj = serializer.Deserialize(reader, type);
            }
            else
            {
                obj = Variant.Create(null);
            }

            if (!reader.Read())
            {
                throw new Exception("Cannot read JSON");
            }
            Trace.Assert(reader.TokenType == JsonToken.EndArray);
            return(Variant.FromObject(obj));
        }