亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fthash.h

?? 支持ttf字體轉換的工具
?? H
字號:
/****************************************************************** * *  fthash.h  - fast dynamic hash tables * *  Copyright 2002 by *  David Turner, Robert Wilhelm, and Werner Lemberg * *  This file is part of the FreeType project, and may only be used, *  modified, and distributed under the terms of the FreeType project *  license, LICENSE.TXT.  By continuing to use, modify, or distribute *  this file you indicate that you have read the license and *  understand and accept it fully. * * *  This header is used to define dynamic hash tables as described *  by the article "Main-Memory Linear Hashing - Some Enhancements *  of Larson's Algorithm" by Mikael Petterson. * *  Basically, linear hashing prevents big "stalls" during *  resizes of the buckets array by only splitting one bucket *  at a time. This ensures excellent response time even when *  the table is frequently resized.. * * *  Note that the use of the FT_Hash type is rather unusual in order *  to be as generic and efficient as possible. See the comments in the *  following definitions for more details. */#ifndef __FT_HASH_H__#define __FT_HASH_H__#include <ft2build.h>#include FT_TYPES_HFT_BEGIN_HEADER /***********************************************************  *  * @type: FT_Hash  *  * @description:  *   handle to a @FT_HashRec structure used to model a  *   dynamic hash table  */  typedef struct FT_HashRec_*      FT_Hash; /***********************************************************  *  * @type: FT_HashNode  *  * @description:  *   handle to a @FT_HashNodeRec structure used to model a  *   single node of a hash table  */  typedef struct FT_HashNodeRec_*  FT_HashNode; /***********************************************************  *  * @type: FT_HashLookup  *  * @description:  *   handle to a @FT_HashNode pointer. This is returned by  *   the @ft_hash_lookup function and can later be used by  *   @ft_hash_add or @ft_hash_remove  */  typedef FT_HashNode*     FT_HashLookup; /***********************************************************  *  * @type: FT_Hash_EqualFunc  *  * @description:  *   a function used to compare two nodes of the hash table  *  * @input:  *   node1 :: handle to first node  *   node2 :: handle to second node  *  * @return:  *   1 iff the 'keys' in 'node1' and 'node2' are identical.  *   0 otherwise.  */  typedef FT_Int  (*FT_Hash_EqualFunc)( FT_HashNode  node1,                                        FT_HashNode  node2 ); /***********************************************************  *  * @struct: FT_HashRec  *  * @description:  *   a structure used to model a dynamic hash table.  *  * @fields:  *   memory       :: memory manager used to allocate  *                   the buckets array and the hash nodes  *  *   buckets      :: array of hash buckets  *  *   node_size    :: size of node in bytes  *   node_compare :: a function used to compare two nodes  *   node_hash    :: a function used to compute the hash  *                   value of a given node  *   p            ::  *   mask         ::  *   slack        ::  *  * @note:  *   'p', 'mask' and 'slack' are control values managed by  *   the hash table. Do not try to interpret them directly.  *  *   You can grab the hash table size by calling  *   '@ft_hash_get_size'.  */  typedef struct FT_HashRec_  {    FT_HashNode*         buckets;    FT_UInt              p;    FT_UInt              mask;  /* really maxp-1 */    FT_Long              slack;    FT_Hash_EqualFunc    node_equal;    FT_Memory            memory;  } FT_HashRec; /***********************************************************  *  * @struct: FT_HashNodeRec  *  * @description:  *   a structure used to model the root fields of a dynamic  *   hash table node.  *  *   it's up to client applications to "sub-class" this  *   structure to add relevant (key,value) definitions  *  * @fields:  *   link :: pointer to next node in bucket's collision list  *   hash :: 32-bit hash value for this node  *  * @note:  *   it's up to client applications to "sub-class" this structure  *   to add relevant (key,value) type definitions. For example,  *   if we want to build a "string -> int" mapping, we could use  *   something like:  *  *   {  *     typedef struct MyNodeRec_  *     {  *       FT_HashNodeRec  hnode;  *       const char*     key;  *       int             value;  *  *     } MyNodeRec, *MyNode;  *   }  *  */  typedef struct FT_HashNodeRec_  {    FT_HashNode  link;    FT_UInt32    hash;  } FT_HashNodeRec; /****************************************************************  *  * @function: ft_hash_init  *  * @description:  *   initialize a dynamic hash table  *  * @input:  *   table      :: handle to target hash table structure  *   node_equal :: node comparison function  *   memory     :: memory manager handle used to allocate the  *                 buckets array within the hash table  *  * @return:  *   error code. 0 means success  *  * @note:  *   the node comparison function should only compare node _keys_  *   and ignore values !! with good hashing computation (which the  *   user must perform itself), the comparison function should be  *   pretty seldom called.  *  *   here is a simple example:  *  *   {  *     static int my_equal( MyNode  node1,  *                          MyNode  node2 )  *     {  *       // compare keys of 'node1' and 'node2'  *       return (strcmp( node1->key, node2->key ) == 0);  *     }  *  *     ....  *  *     ft_hash_init( &hash, (FT_Hash_EqualFunc) my_compare, memory );  *     ....  *   }  */  FT_BASE( FT_Error )  ft_hash_init( FT_Hash              table,                FT_Hash_EqualFunc  compare,                FT_Memory            memory ); /****************************************************************  *  * @function: ft_hash_lookup  *  * @description:  *   search a hash table to find a node corresponding to a given  *   key.  *  * @input:  *   table   :: handle to target hash table structure  *   keynode :: handle to a reference hash node that will be  *              only used for key comparisons with the table's  *              elements  *  * @return:  *   a pointer-to-hash-node value, which must be used as followed:  *  *   - if '*result' is NULL, the key wasn't found in the hash  *     table. The value of 'result' can be used to add new elements  *     through @ft_hash_add however..  *  *   - if '*result' is not NULL, it's a handle to the first table  *     node that corresponds to the search key. The value of 'result'  *     can be used to remove this element through @ft_hash_remove  *  * @note:  *   here is an example:  *  *   {  *     // maps a string to an integer with a hash table  *     // returns -1 in case of failure  *     //  *     int  my_lookup( FT_Hash      table,  *                     const char*  key )  *     {  *       MyNode*    pnode;  *       MyNodeRec  noderec;  *  *       // set-up key node. It's 'hash' and 'key' fields must  *       // be set correctly.. we ignore 'link' and 'value'  *       //  *       noderec.hnode.hash = strhash( key );  *       noderec.key        = key;  *  *       // perform search - return value  *       //  *       pnode = (MyNode) ft_hash_lookup( table, &noderec );  *       if ( *pnode )  *       {  *         // we found it  *         return (*pnode)->value;  *       }  *       return -1;  *     }  *   }  */  FT_BASE_DEF( FT_HashLookup )  ft_hash_lookup( FT_Hash      table,                  FT_HashNode  keynode ); /****************************************************************  *  * @function: ft_hash_add  *  * @description:  *   add a new node to a dynamic hash table. the user must  *   call @ft_hash_lookup and allocate a new node before calling  *   this function.  *  * @input:  *   table    :: hash table handle  *   lookup   :: pointer-to-hash-node value returned by @ft_hash_lookup  *   new_node :: handle to new hash node. All its fields must be correctly  *               set, including 'hash'.  *  * @return:  *   error code. 0 means success  *  * @note:  *   this function should always be used _after_ a call to @ft_hash_lookup  *   that returns a pointer to a NULL  handle. Here's an example:  *  *   {  *     // sets the value corresponding to a given string key  *     //  *     void  my_set( FT_Hash      table,  *                   const char*  key,  *                   int          value )  *     {  *       MyNode*    pnode;  *       MyNodeRec  noderec;  *       MyNode     node;  *  *       // set-up key node. It's 'hash' and 'key' fields must  *       // be set correctly..  *       noderec.hnode.hash = strhash( key );  *       noderec.key        = key;  *  *       // perform search - return value  *       pnode = (MyNode) ft_hash_lookup( table, &noderec );  *       if ( *pnode )  *       {  *         // we found it, simply replace the value in the node  *         (*pnode)->value = value;  *         return;  *       }  *  *       // allocate a new node - and set it up  *       node = (MyNode) malloc( sizeof(*node) );  *       if ( node == NULL ) .....  *  *       node->hnode.hash = noderec.hnode.hash;  *       node->key        = key;  *       node->value      = value;  *  *       // add it to the hash table  *       error = ft_hash_add( table, pnode, node );  *       if (error) ....  *     }  */  FT_BASE( FT_Error )  ft_hash_add( FT_Hash        table,               FT_HashLookup  lookup,               FT_HashNode    new_node ); /****************************************************************  *  * @function: ft_hash_remove  *  * @description:  *   try to remove the node corresponding to a given key from  *   a hash table. This must be called after @ft_hash_lookup  *  * @input:  *   table   :: hash table handle  *   lookup  :: pointer-to-hash-node value returned by @ft_hash_lookup  *  * @note:  *   this function doesn't free the node itself !! Here's an example:  *  *   {  *     // sets the value corresponding to a given string key  *     //  *     void  my_remove( FT_Hash      table,  *                      const char*  key )  *     {  *       MyNodeRec  noderec;  *       MyNode     node;  *  *       noderec.hnode.hash = strhash(key);  *       noderec.key        = key;  *       node               = &noderec;  *  *       pnode = ft_hash_lookup( table, &noderec );  *       node  = *pnode;  *       if ( node != NULL )  *       {  *         error = ft_hash_remove( table, pnode );  *         if ( !error )  *           free( node );  *       }  *     }  *   }  */  FT_BASE( FT_Error )  ft_hash_remove( FT_Hash        table,                  FT_HashLookup  lookup ); /****************************************************************  *  * @function: ft_hash_get_size  *  * @description:  *   return the number of elements in a given hash table  *  * @input:  *   table   :: handle to target hash table structure  *  * @return:  *   number of elements. 0 if empty  */  FT_BASE( FT_UInt )  ft_hash_get_size( FT_Hash  table ); /****************************************************************  *  * @functype: FT_Hash_ForeachFunc  *  * @description:  *   a function used to iterate over all elements of a given  *   hash table  *  * @input:  *   node :: handle to target @FT_HashNodeRec node structure  *   data :: optional argument to iteration routine  *  * @also:  @ft_hash_foreach  */  typedef void  (*FT_Hash_ForeachFunc)( const FT_HashNode  node,                                        const FT_Pointer   data ); /****************************************************************  *  * @function: ft_hash_foreach  *  * @description:  *   parse over all elements in a hash table  *  * @input:  *   table        :: handle to target hash table structure  *   foreach_func :: iteration routine called for each element  *   foreach_data :: optional argument to the iteration routine  *  * @note:  *   this function is often used to release all elements from a  *   hash table. See the example given for @ft_hash_done  */  FT_BASE( void )  ft_hash_foreach( FT_Hash              table,                   FT_Hash_ForeachFunc  foreach_func,                   const FT_Pointer     foreach_data ); /****************************************************************  *  * @function: ft_hash_done  *  * @description:  *   finalize a given hash table  *  * @input:  *   table     :: handle to target hash table structure  *   node_func :: optional iteration function pointer. this  *                can be used to destroy all nodes explicitely  *   node_data :: optional argument to the node iterator  *  * @note:  *   this function simply frees the hash table's buckets.  *   you probably will need to call @ft_hash_foreach to  *   destroy all its elements before @ft_hash_done, as in  *   the following example:  *  *   {  *     static void  my_node_clear( const MyNode  node )  *     {  *       free( node );  *     }  *  *     static void  my_done( FT_Hash  table )  *     {  *       ft_hash_done( table, (FT_Hash_ForeachFunc) my_node_clear, NULL );  *     }  *   }  */  FT_BASE( void )  ft_hash_done( FT_Hash              table,                FT_Hash_ForeachFunc  item_func,                const FT_Pointer     item_data ); /* */ /* compute bucket index from hash value in a dynamic hash table */ /* this is only used to break encapsulation to speed lookups in */ /* the FreeType cache manager !!                                */ /*                                                              */#define  FT_HASH_COMPUTE_INDEX(_table,_hash,_index)                  \             {                                                       \               FT_UInt  _mask  = (_table)->mask;                     \               FT_UInt  _hash0 = (_hash);                            \                                                                     \               (_index) = (FT_UInt)( (_hash0) & _mask ) );           \               if ( (_index) < (_table)->p )                         \                 (_index) = (FT_uInt)( (_hash0) & ( 2*_mask+1 ) );   \             }FT_END_HEADER#endif /* __FT_HASH_H__ */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本到不卡免费一区二区| 日本一区二区电影| 国产精品欧美久久久久无广告| 亚洲午夜电影在线| 99精品欧美一区二区蜜桃免费 | 国产欧美日韩亚州综合| 日欧美一区二区| 91福利资源站| 日韩毛片一二三区| 蜜桃精品视频在线观看| 欧美无砖专区一中文字| 国产精品久久久久久久久搜平片 | www精品美女久久久tv| 午夜伦欧美伦电影理论片| 91啪在线观看| 亚洲欧洲性图库| 成人av在线看| 国产精品全国免费观看高清| 国产一区二区精品在线观看| 欧美成人精精品一区二区频| 秋霞电影一区二区| 制服丝袜一区二区三区| 天堂蜜桃一区二区三区| 欧美欧美欧美欧美| 日韩国产一区二| 欧美福利视频导航| 强制捆绑调教一区二区| 欧美高清激情brazzers| 日本特黄久久久高潮| 日韩欧美电影在线| 国产综合色精品一区二区三区| 欧美大度的电影原声| 国产一区在线观看视频| 久久精品一区二区三区不卡牛牛 | 欧美日韩综合在线| 亚洲资源在线观看| 7777精品伊人久久久大香线蕉完整版| 亚洲一区二区三区免费视频| 欧美日韩dvd在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 91精品国产全国免费观看| 天堂一区二区在线免费观看| 日韩三级在线观看| 国产乱淫av一区二区三区| 中文字幕第一页久久| 91视频在线观看免费| 亚洲妇女屁股眼交7| 日韩天堂在线观看| 国产成人自拍高清视频在线免费播放| 久久噜噜亚洲综合| 91国偷自产一区二区三区观看 | 伊人夜夜躁av伊人久久| 欧美日韩国产精品成人| 日韩不卡免费视频| 国产三级一区二区三区| 91久久精品日日躁夜夜躁欧美| 午夜久久久久久| 久久久久久久综合日本| 色88888久久久久久影院野外| 天天综合色天天| 国产精品三级在线观看| 欧美在线一区二区三区| 国内精品写真在线观看| 亚洲女女做受ⅹxx高潮| 欧美一区二区播放| 99久免费精品视频在线观看| 偷拍日韩校园综合在线| 欧美国产精品一区| 在线播放中文一区| 99re亚洲国产精品| 经典一区二区三区| 一区二区欧美在线观看| 精品国产乱码91久久久久久网站| aaa欧美日韩| 国内偷窥港台综合视频在线播放| 亚洲品质自拍视频网站| 久久日韩粉嫩一区二区三区| 在线免费av一区| 盗摄精品av一区二区三区| 午夜精品福利一区二区三区蜜桃| 欧美激情中文字幕| 3atv在线一区二区三区| 色综合久久88色综合天天6 | 国产主播一区二区| 亚洲午夜免费视频| 国产欧美一区二区精品性色| 欧美久久一区二区| 色综合欧美在线| 国产成人在线视频免费播放| 日本中文在线一区| 亚洲午夜三级在线| 亚洲欧美电影院| 中文字幕日本不卡| 欧美国产日韩亚洲一区| 久久综合久久99| 日韩区在线观看| 91精品蜜臀在线一区尤物| 色婷婷综合五月| 成人国产精品免费| 国产精品1区2区3区| 精东粉嫩av免费一区二区三区| 免费看日韩精品| 日韩精品成人一区二区在线| 亚洲图片欧美一区| 亚洲欧美另类小说| 一区二区三区不卡在线观看| 国产精品不卡一区二区三区| 久久精品人人做人人爽人人| 久久午夜羞羞影院免费观看| 精品88久久久久88久久久| 日韩免费看的电影| 欧美不卡一区二区| 欧美成人a∨高清免费观看| 日韩三级电影网址| 精品国精品自拍自在线| 精品久久久久久久一区二区蜜臀| 日韩限制级电影在线观看| 日韩精品中文字幕在线不卡尤物| 精品国产一区二区三区不卡| 欧美tk—视频vk| 国产欧美va欧美不卡在线| 久久久精品综合| 日韩毛片一二三区| 亚洲自拍偷拍av| 免费欧美在线视频| 国产高清视频一区| 91尤物视频在线观看| 欧美在线观看视频一区二区| 6080午夜不卡| 精品少妇一区二区三区在线视频| 国产欧美一区在线| 一区二区三区在线观看网站| 亚洲成在人线在线播放| 奇米精品一区二区三区在线观看 | 亚洲欧美一区二区久久 | 白白色亚洲国产精品| 91久久一区二区| 日韩三级在线观看| 中文一区二区完整视频在线观看| 一区二区在线免费| 看电视剧不卡顿的网站| 成人av网站在线观看免费| 欧美视频在线一区二区三区| 日韩欧美的一区| 亚洲色图.com| 麻豆国产一区二区| 不卡一卡二卡三乱码免费网站| 欧美午夜免费电影| 精品少妇一区二区三区视频免付费| 亚洲国产精品二十页| 亚洲v日本v欧美v久久精品| 国产精品一区二区男女羞羞无遮挡| 色综合一区二区三区| 日韩欧美一二三区| 亚洲人成7777| 国产一区二区三区免费| 在线视频一区二区三区| 26uuu亚洲综合色| 亚洲综合免费观看高清完整版 | 国产美女精品在线| 欧美丝袜自拍制服另类| 久久众筹精品私拍模特| 一级精品视频在线观看宜春院 | 国产在线观看免费一区| 欧美日韩日日骚| 国产精品传媒入口麻豆| 韩国毛片一区二区三区| 制服视频三区第一页精品| 中文字幕综合网| 国产精品88888| 日韩精品一区二区三区四区 | 欧美视频中文字幕| 亚洲欧美日韩久久| 国产激情一区二区三区| 精品伦理精品一区| 精品一区二区三区香蕉蜜桃| 在线视频国内一区二区| 国产精品乱人伦一区二区| 久久er精品视频| 欧美一区二区三区婷婷月色| 亚洲二区视频在线| 日本福利一区二区| 亚洲三级理论片| 粉嫩高潮美女一区二区三区| 久久免费看少妇高潮| 国内精品视频一区二区三区八戒| 欧美一区二区在线不卡| 日本不卡不码高清免费观看| 欧美日韩黄色影视| 亚洲福利一区二区三区| 日本韩国视频一区二区| 亚洲日本乱码在线观看| 色先锋aa成人| 亚洲一区二区在线观看视频| 在线这里只有精品| 亚洲愉拍自拍另类高清精品| 欧美综合一区二区| 亚洲一区二区在线免费看| 欧美日韩二区三区| 日韩精品亚洲专区|