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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? chashtableex.hpp

?? LRU算法的C++實(shí)現(xiàn)類。封裝得不錯(cuò)
?? HPP
?? 第 1 頁 / 共 3 頁
字號(hào):

#ifndef __C_HASHTABLEEX_HPP__
#define __C_HASHTABLEEX_HPP__

#include <iostream>
#include <utility>
#include "CShmManager.hpp"

using namespace std;

const int CHASH_TABLE_EX_MAX_HASH_NODE_COUNT = 50000000;
enum { _INIT_TABLE = 1,_CHECK_TABLE = 0 };

#define SHT_MIN_HEAD			0x100
#define SHT_BUCKET_ALIGN		0x100
#define SHT_MIN_ALIGN			0x08
#define SHT_VERSION				0x0101

#define SHTF_NEEDFREE			0x01

struct tagSHitem
{
	int iPrev;
	int iNext;
    int iLruPrev;
    int iLruNext;
	unsigned uCode;
	int fValid;
	char szData[1];
};

typedef struct tagSHitem		SHITEM;
typedef struct tagSHitem		*LPSHITEM;

struct tagSHbucket
{
	int iCount;
	int iHead;
};

typedef struct tagSHbucket		SHBUCKET;
typedef struct tagSHbucket		*LPSHBUCKET;

struct tagSHtable
{
	unsigned int cbSize;		/* the size of this struct. */
	unsigned int uFlags;		/* some flags. */
	int iVersion;				/* version number. */
	int iBuff;					/* the size of the buff. */

	int iBucket;				/* bucket number used. */
	int iMax;					/* maximum items can store. */
	int iItem;					/* current item number. */
	int iHeadSize;

	int iBucketOff;
	int iBucketSize;

	int iDataOff;
	int iDataSize;
	int iDataUnitMin;			/* the data-unit's real size. */
	int iDataUnitMax;			/* the data-unit's occupy size.*/

	int iFreeHead;
    int iLruHead;
    int iLruTail;
	int iRes;					/* reserved. */
};

typedef struct tagSHtable			SHTABLE;
typedef struct tagSHtable			*LPSHTABLE;

#define SHT_ROUND(size)					( ( (size) + SHT_MIN_ALIGN - 1) /SHT_MIN_ALIGN*SHT_MIN_ALIGN )

#define SHT_HEADSIZE()					( SHT_MIN_HEAD < sizeof(SHTABLE) ? sizeof(SHTABLE) : SHT_MIN_HEAD )

#define SHT_BUCKETSIZE(buck)			( (buck) * sizeof(SHBUCKET) )

#define SHT_DATAUNIT(data)				SHT_ROUND((data) + offsetof(SHITEM, szData))

#define SHT_DATASIZE(max, unit)			( (max) * SHT_DATAUNIT(unit) )

#define SHT_SIZE(buck, max, unit)		( SHT_HEADSIZE() + SHT_BUCKETSIZE(buck) + SHT_DATASIZE(max, unit) )

#define SHT_GET_BUCKET(pstTab, i)		( (LPSHBUCKET) ( ((int)(pstTab)) + pstTab->iBucketOff + i*sizeof(SHBUCKET) ) )

#define SHT_GET_ITEM(pstTab, i)			( (LPSHITEM) ( ((int)(pstTab)) + pstTab->iDataOff + i*pstTab->iDataUnitMax ) )

#define SHT_DATA2ITEM(pvData)			( (SHITEM*) ( ((int)(pvData)) - offsetof(SHITEM, szData)) )
#define SHT_ITEM2DATA(pvItem)			( (pvItem)->szData )

#define SHT_DATA2INDEX(pstTab, pvData)			(( ((int)(pstTab)) + pstTab->iDataOff -  ( ((int)(pvData)) - offsetof(SHITEM, szData)) )/pstTab->iDataUnitMax)

typedef CShmManager<SHTABLE> shmAlloc;

template <class _Val, class _ExtractKey, class _Alloc = shmAlloc >
class CHashTableEx;

template <class _Val,
          class _ExtractKey, class _Alloc>
struct _Hashtable_iterator;

template <class _Val,
          class _ExtractKey, class _Alloc>
struct _Hashtable_const_iterator;

template <class _Val,
          class _ExtractKey, class _Alloc>
struct _Hashtable_iterator {
  typedef CHashTableEx<_Val,_ExtractKey,_Alloc>
          _Hashtable;
  typedef _Hashtable_iterator<_Val,   
                              _ExtractKey,  _Alloc>
          iterator;
  typedef _Hashtable_const_iterator<_Val,   
                                    _ExtractKey,  _Alloc>
          const_iterator;
  typedef SHITEM _Node;

  typedef _Val value_type;
  typedef size_t size_type;
  typedef ptrdiff_t         difference_type;  
  typedef _Val& reference;
  typedef _Val* pointer;

  _Node* _M_cur;
  _Hashtable* _M_ht;

  _Hashtable_iterator(_Node* __n, _Hashtable* __tab) 
    : _M_cur(__n), _M_ht(__tab) {}
  _Hashtable_iterator() {}
  reference operator*() const { return *(pointer)_M_cur->szData; }
  pointer operator->() const { return &(operator*()); }
  iterator& operator++();
  iterator operator++(int);
  bool operator==(const iterator& __it) const
    { return _M_cur == __it._M_cur; }
  bool operator!=(const iterator& __it) const
    { return _M_cur != __it._M_cur; }
};


template <class _Val,
          class _ExtractKey, class _Alloc>
struct _Hashtable_const_iterator {
  typedef CHashTableEx<_Val,_ExtractKey,_Alloc>
          _Hashtable;
  typedef _Hashtable_iterator<_Val, 
                              _ExtractKey,_Alloc>
          iterator;
  typedef _Hashtable_const_iterator<_Val,   
                                    _ExtractKey,  _Alloc>
          const_iterator;
  typedef SHITEM _Node;

  typedef forward_iterator_tag iterator_category;
  typedef _Val value_type;
  typedef ptrdiff_t difference_type;
  typedef size_t size_type;
  typedef const _Val& reference;
  typedef const _Val* pointer;

  const _Node* _M_cur;
  const _Hashtable* _M_ht;

  _Hashtable_const_iterator(const _Node* __n, const _Hashtable* __tab)
    : _M_cur(__n), _M_ht(__tab) {}
  _Hashtable_const_iterator() {}
  _Hashtable_const_iterator(const iterator& __it) 
    : _M_cur(__it._M_cur), _M_ht(__it._M_ht) {}
  reference operator*() const { return *(pointer)_M_cur->szData;; }
  pointer operator->() const { return &(operator*()); }
  const_iterator& operator++();
  const_iterator operator++(int);
  bool operator==(const const_iterator& __it) const 
    { return _M_cur == __it._M_cur; }
  bool operator!=(const const_iterator& __it) const 
    { return _M_cur != __it._M_cur; }
};

// Forward declaration of operator==.

template <class _Val, class _Ex, class _All>
class CHashTableEx;

template <class _Val,
          class _ExtractKey, class _Alloc>
class CHashTableEx {
public:
  typedef _Val value_type;

  typedef size_t            size_type;
  typedef ptrdiff_t         difference_type;
  typedef value_type*       pointer;
  typedef const value_type* const_pointer;
  typedef value_type&       reference;
  typedef const value_type& const_reference;

private:
  typedef SHITEM _Node;

public:
  typedef _Alloc allocator_type;
private:
  allocator_type _M_table_allocator;
  LPSHTABLE _M_get_Table(long iTblSize) { return _M_table_allocator.allocate(iTblSize); }
  void _M_put_Table(LPSHTABLE pTbl) { return _M_table_allocator.deallocate(pTbl); }
    #define __HASH_ALLOC_INIT(__a) _M_table_allocator(__a),
private:
  _ExtractKey           _M_get_key;

  LPSHTABLE _M_ptable;
  size_type             _M_num_elements;  

public:
  typedef _Hashtable_iterator<_Val,_ExtractKey,_Alloc>
          iterator;
  typedef _Hashtable_const_iterator<_Val,_ExtractKey,
                                    _Alloc>
          const_iterator;

  friend struct
  _Hashtable_iterator<_Val,_ExtractKey,_Alloc>;
  friend struct
  _Hashtable_const_iterator<_Val,_ExtractKey,_Alloc>;

public:
  CHashTableEx(size_type n,
            int inittype,
            const _ExtractKey& __ext,
            const allocator_type& __a = shmAlloc())
    : __HASH_ALLOC_INIT(__a)
    _M_get_key(__ext)
  {
    _M_num_elements = n;
    Init(inittype);
    return;
  }
  ~CHashTableEx() { _M_put_Table(_M_ptable);}
    int Init(int fCreate = _CHECK_TABLE);
    int dump_all(ostream &out = cout);
    int dump_valid(ostream &out = cout);
    int dump_lru(ostream &out = cout);

  size_type size() const 
  {
      return _M_ptable->iItem; 
  }
  size_type max_size() const { return _M_ptable->iMax; }
  bool empty() const { return size() == 0; }

  //遍歷方式不更新LRU
  iterator begin()
  {
    int i;
    _Val* pvData;
    LPSHITEM pstItem;
    for(i=0; i<_M_ptable->iMax; i++)
    {
    	pvData	=	sht_pos(_M_ptable, i, NULL);

    	pstItem	=	SHT_DATA2ITEM(pvData);

    	if( pstItem->fValid )
    	{
            return iterator(pstItem, this);
    	}
    }      
    return end();
  }

  iterator end() { return iterator(0, this); }

  const_iterator begin() const
  {
    int i;
    _Val* pvData;
    LPSHITEM pstItem;
    for(i=0; i<_M_ptable->iMax; i++)
    {
    	pvData	=	sht_pos(_M_ptable, i, NULL);

    	pstItem	=	SHT_DATA2ITEM(pvData);

    	if( pstItem->fValid )
    	{
            return const_iterator(pstItem, this);
    	}
    }
    return end();
  }

  const_iterator end() const { return const_iterator(0, this); }

public:

  size_type max_bucket_count() const
    { return _M_ptable->iBucket; } 

  size_type elems_in_bucket(size_type __bucket) const
  {
    LPSHBUCKET pstBucket;
    pstBucket	=	SHT_GET_BUCKET(_M_ptable, __bucket);
    return pstBucket->iCount;
  }

  pair<iterator, bool> insert_unique(const value_type& __obj)
  {
    return insert_unique_noresize(__obj);
  }

  iterator insert_equal(const value_type& __obj)
  {
    return insert_equal_noresize(__obj);
  }

  pair<iterator, bool> insert_unique_noresize(const value_type& __obj)
    {
        value_type *pdata = NULL;
        LPSHITEM pstItem;

        pdata = sht_insert_unique( _M_ptable, __obj);
        if ( NULL != pdata )
        {
            pstItem	=	SHT_DATA2ITEM(pdata);
            memcpy(pdata, &__obj, sizeof(__obj));
            return pair<iterator, bool>(iterator(pstItem, this), true);
        }
        return pair<iterator, bool>(iterator(0, this), false);
    }
  iterator insert_equal_noresize(const value_type& __obj)
{

    value_type *pdata = NULL;
    LPSHITEM pstItem;
    
    sht_insert_multi(_M_ptable, __obj);
    if ( NULL != pdata )
    {
        pstItem	=	SHT_DATA2ITEM(pdata);
        memcpy(pdata, &__obj, sizeof(__obj));
        return iterator(pstItem, this);
    }
    return iterator(0, this);
}

  pointer find_or_insert(const value_type& __obj)
    {
        value_type *pdata = sht_find(_M_ptable, __obj);
        if( pdata != NULL)
        {
        	return pdata;
        }

        return sht_insert_multi(_M_ptable, __obj);
    } 
    pointer search(const value_type& __obj)
    {
        return sht_find(_M_ptable, __obj);
    }

  iterator find(const unsigned int & __key) 
  {
    int iBucket;
    LPSHBUCKET pstBucket;
    _Node* pstItem;
    int iNode;
    int n;
    iBucket	=	(int) (__key % (unsigned int)_M_ptable->iBucket);
    pstBucket	=	SHT_GET_BUCKET(_M_ptable, iBucket);

    if( pstBucket->iCount<=0 )
    {
    	return iterator(0, this);
    }

    iNode	=	pstBucket->iHead;

    n		=	0;
    while(iNode>=0 && iNode<_M_ptable->iMax && n<pstBucket->iCount )
    {
        pstItem	=	SHT_GET_ITEM(_M_ptable, iNode);
        if( pstItem->uCode ==__key)
        {
          return iterator(pstItem, this);
        }

    	iNode	=	pstItem->iNext;
    	n++;
    }
  
    return iterator(0, this);
  } 

  const_iterator find(const unsigned int & __key) const
  {
   int iBucket;
    LPSHBUCKET pstBucket;
    const _Node* pstItem;
    int iNode;
    int n;
    const _Node* __first = NULL;
    iBucket	=	(int) (__key % (unsigned int)_M_ptable->iBucket);
    pstBucket	=	SHT_GET_BUCKET(_M_ptable, iBucket);

    if( pstBucket->iCount<=0 )
    {
    	return const_iterator(__first, this);
    }

    iNode	=	pstBucket->iHead;

    n		=	0;
    while(iNode>=0 && iNode<_M_ptable->iMax && n<pstBucket->iCount )
    {
        pstItem	=	SHT_GET_ITEM(_M_ptable, iNode);
        if( pstItem->uCode ==__key)
        {
          return const_iterator(pstItem, this);
        }

    	iNode	=	pstItem->iNext;
    	n++;
    }
  
    return const_iterator(__first, this);
  } 

  size_type count(const unsigned int &__key) const
  {
   int iBucket;
    LPSHBUCKET pstBucket;
    const _Node* pstItem;
    int iNode;
    int n;
    size_type __result = 0;
    iBucket	=	(int) (__key % (unsigned int)_M_ptable->iBucket);
    pstBucket	=	SHT_GET_BUCKET(_M_ptable, iBucket);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91网站黄www| 亚洲成人av在线电影| 国产一区二三区好的| 欧美视频在线播放| 亚洲va欧美va人人爽| 91精品久久久久久久久99蜜臂| 亚洲va国产va欧美va观看| 日韩欧美国产麻豆| 国内精品伊人久久久久影院对白| 久久嫩草精品久久久精品一| 国模无码大尺度一区二区三区| 久久天堂av综合合色蜜桃网| 岛国av在线一区| 亚洲日本丝袜连裤袜办公室| 欧美午夜电影网| 老司机一区二区| 日本一区二区三区久久久久久久久不 | 蜜臀va亚洲va欧美va天堂| 日韩欧美国产三级| av中文一区二区三区| 亚洲精品自拍动漫在线| 欧美情侣在线播放| 国产一区视频导航| 亚洲乱码中文字幕| 欧美一卡在线观看| 成人免费视频caoporn| 一区二区三区在线影院| 91精品国产综合久久国产大片 | 国产综合色产在线精品| 国产精品免费观看视频| 欧美日韩精品欧美日韩精品一综合| 久久精品免费看| 中文字幕日韩av资源站| 91精品国产入口在线| 国产suv一区二区三区88区| 亚洲一区二区三区影院| 26uuu亚洲综合色| 在线观看视频一区| 久久9热精品视频| 亚洲欧美一区二区三区国产精品| 在线综合+亚洲+欧美中文字幕| 国产91色综合久久免费分享| 性做久久久久久免费观看欧美| 国产视频视频一区| 91麻豆精品国产91久久久久久| 国产成人a级片| 午夜不卡av在线| 国产精品夫妻自拍| 2019国产精品| 欧美精品aⅴ在线视频| 91天堂素人约啪| 国产麻豆欧美日韩一区| 日本欧美久久久久免费播放网| 亚洲日本丝袜连裤袜办公室| 久久网站最新地址| 1024成人网色www| 精品美女在线播放| 欧美日本一区二区三区四区| 97精品电影院| 成人性视频免费网站| 激情文学综合丁香| 天堂va蜜桃一区二区三区漫画版 | 成人av电影免费观看| 精品一区二区三区在线观看国产| 亚洲国产你懂的| 一区二区三区欧美久久| 亚洲欧美自拍偷拍色图| 国产精品污污网站在线观看| 久久久久97国产精华液好用吗| 日韩欧美色综合| 欧美一区二区三区不卡| 欧美肥妇bbw| 欧美日韩电影一区| 欧美日韩国产三级| 欧美日韩一本到| 精品婷婷伊人一区三区三| 色欧美乱欧美15图片| 99国产精品视频免费观看| 成人99免费视频| 91在线一区二区三区| 99精品视频在线观看免费| 成人高清免费观看| a级精品国产片在线观看| 成人av资源下载| 成人aaaa免费全部观看| 色综合天天综合在线视频| 91色视频在线| 91成人国产精品| 欧美亚州韩日在线看免费版国语版| 91成人网在线| 制服丝袜亚洲网站| 日韩欧美亚洲国产另类| 久久综合色天天久久综合图片| 欧美精品一区二区三区很污很色的 | 日韩亚洲欧美一区二区三区| 欧美一区二区三区性视频| 日韩欧美一二三| 欧美经典一区二区三区| 国产精品第四页| 一区二区不卡在线播放| 午夜成人在线视频| 国产一区二区导航在线播放| 成人性视频免费网站| 在线精品视频免费播放| 欧美一二三区在线观看| 久久精品亚洲国产奇米99| 亚洲丝袜制服诱惑| 性欧美大战久久久久久久久| 免费在线看成人av| 国产成人精品影视| 色av综合在线| 欧美大片免费久久精品三p | 91麻豆精品国产91久久久使用方法| 日韩精品一区二区三区四区| 国产精品网曝门| 亚洲成人激情综合网| 激情成人综合网| 色综合中文综合网| 在线免费亚洲电影| 欧美不卡一区二区| 亚洲天堂网中文字| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产.欧美.日韩| 8x8x8国产精品| 国产精品欧美久久久久一区二区| 亚洲高清免费观看| 国产成人8x视频一区二区| 欧美人与性动xxxx| 亚洲国产高清在线观看视频| 无码av中文一区二区三区桃花岛| 粉嫩av一区二区三区在线播放| 欧美日韩国产一级| 国产精品毛片久久久久久久| 日本va欧美va欧美va精品| 成人激情免费网站| 日韩精品中文字幕在线一区| 亚洲精品ww久久久久久p站| 精品亚洲国产成人av制服丝袜| 在线观看国产一区二区| 国产视频一区二区在线| 美女诱惑一区二区| 在线视频一区二区免费| 日本一区二区动态图| 老司机精品视频线观看86 | 亚洲国产精品一区二区久久恐怖片| 国产伦理精品不卡| 欧美一区二区三区视频在线| 亚洲精品你懂的| 成人动漫视频在线| 亚洲精品一区二区三区影院| 午夜视频一区二区| 在线欧美日韩国产| 亚洲视频图片小说| 成人av在线资源网| 国产亚洲一本大道中文在线| 美女视频黄久久| 欧美日本视频在线| 亚洲一区二区三区自拍| 色欲综合视频天天天| 中文字幕一区二区视频| 国产成人超碰人人澡人人澡| 精品理论电影在线观看| 免费成人在线观看视频| 4438x成人网最大色成网站| 一个色在线综合| 在线欧美小视频| 亚洲福利国产精品| 欧美日韩一区成人| 亚洲国产精品久久人人爱蜜臀| 一本色道久久综合亚洲精品按摩| 综合在线观看色| 91在线一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 91丨porny丨蝌蚪视频| 国产精品久久久久久久久免费丝袜| 国产乱人伦偷精品视频不卡| 欧美精品一区二区三区在线| 国产福利精品导航| 国产清纯美女被跳蛋高潮一区二区久久w| 九九精品一区二区| 久久久国际精品| 国产suv精品一区二区三区| 中文字幕一区二区三区四区 | 国产午夜一区二区三区| 国产精品一区二区不卡| 欧美激情在线看| 91首页免费视频| 亚洲国产中文字幕在线视频综合 | 91精品国产美女浴室洗澡无遮挡| 日韩电影在线观看网站| 欧美大片拔萝卜| 粉嫩久久99精品久久久久久夜| 亚洲欧洲日韩一区二区三区| 在线看一区二区| 久久99日本精品| 欧美国产日韩在线观看| 色狠狠av一区二区三区| 三级成人在线视频| 久久久久国产精品麻豆ai换脸| 成人av在线网|