zoukankan      html  css  js  c++  java
  • TSynDictionary

    TSynDictionary

    mormot.core.json.pas

    /// thread-safe dictionary to store some values from associated keys
    // - will maintain a dynamic array of values, associated with a hash table
    // for the keys, so that setting or retrieving values would be O(1)
    // - all process is protected by a TSynLocker, so will be thread-safe
    // - TDynArray is a wrapper which do not store anything, whereas this class
    // is able to store both keys and values, and provide convenient methods to
    // access the stored data, including JSON serialization and binary storage
    TSynDictionary = class(TSynLocked)

    ///线程安全的字典,用于存储关联键的一些值

    // -将维护一个与散列表关联的动态值数组

    //用于键,因此设置或检索值将是O(1)

    // -所有进程都由TSynLocker保护,因此是线程安全的

    // - TDynArray是一个包装器,它不存储任何东西,而这个类

    //能够存储键和值,并提供方便的方法

    //访问存储的数据,包括JSON序列化和二进制存储

    procedure TTestCoreBase._TSynDictionary;
    type
      tvalue = variant;
    
      tvalues = TVariantDynArray;
    const
      MAX = 10000;
    var
      dict: TSynDictionary;
    
      procedure Test;
      var
        k: RawUTF8;
        v: tvalue;
        i: integer;
      begin
        check(dict.Count = MAX);
        for i := 1 to MAX do
        begin
          UInt32ToUTF8(i, k);
          v := 0;
          check(dict.Exists(k));
          check(dict.FindAndCopy(k, v));
          check(v = i);
        end;
      end;
    
    var
      v: tvalue;
      s, k: RawUTF8;
      i: integer;
      exists: boolean;
    begin
      dict := TSynDictionary.Create(TypeInfo(TRawUTF8DynArray), TypeInfo(tvalues));
      try
        for i := 1 to MAX do
        begin
          UInt32ToUTF8(i, k);
          v := i;
          check(dict.Add(k, v) = i - 1);
        end;
        Test;
        s := dict.SaveToJSON;
        check(dict.Exists(k));
        dict.DeleteAll;
        check(dict.Count = 0);
        check(not dict.Exists(k));
        check(dict.LoadFromJSON(s));
        Test;
        s := dict.SaveToBinary;
      finally
        dict.Free;
      end;
      dict := TSynDictionary.Create(TypeInfo(TRawUTF8DynArray), TypeInfo(tvalues));
      try
        check(dict.LoadFromBinary(s));
        Test;
        for i := MAX downto 1 do
          if i and 127 = 0 then
          begin
            UInt32ToUTF8(i, k);
            check(dict.Delete(k) = i - 1);
            check(dict.Exists(k) = false);
          end;
        for i := 1 to MAX do
        begin
          exists := (i and 127) <> 0;
          UInt32ToUTF8(i, k);
          check(dict.Exists(k) = exists);
          if exists then
          begin
            v := 0;
            check(dict.FindAndCopy(k, v));
            check(v = i);
            if i < 10000 then
            begin // FindKeyFromValue() brute force is slow
              k := '';
              check(dict.FindKeyFromValue(v, k));
              check(GetInteger(pointer(k)) = i);
            end;
          end;
        end;
      finally
        dict.Free;
      end;
    end;
    

      

  • 相关阅读:
    CSS边框(圆角、阴影、背景图片)
    CSS3浏览器兼容
    HTML5全局属性
    HTLM5新增属性
    HTML5标签
    如何开始使用bootstrap
    重新了解Java基础(三)-运行机制&HelloWorld
    重新了解Java基础(二)-Java的特性
    Java关键字之native
    重新了解Java基础(一)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/14072844.html
Copyright © 2011-2022 走看看