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

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

?? chashtableex.hpp

?? LRU算法的C++實現類。封裝得不錯
?? HPP
?? 第 1 頁 / 共 3 頁
字號:

#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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区久久久| 91精品国产综合久久蜜臀| 欧美日韩国产精选| 久久久精品免费观看| 偷窥少妇高潮呻吟av久久免费| 久久成人综合网| 欧美午夜精品久久久久久超碰| 日本一区二区三区dvd视频在线| 日本不卡不码高清免费观看| 99精品在线免费| 欧美激情在线一区二区| 免费久久精品视频| 欧美精品色综合| 伊人一区二区三区| 成人黄色777网| 久久新电视剧免费观看| 日韩黄色一级片| 欧美亚洲尤物久久| 亚洲免费观看视频| 成人一道本在线| 久久综合中文字幕| 日韩av一区二区在线影视| 欧美亚洲日本一区| 亚洲一区精品在线| 99国产精品一区| 中文字幕电影一区| 国产精品一区2区| 精品不卡在线视频| 免费高清在线视频一区·| 欧美日韩成人在线| 亚洲福利视频三区| 欧美在线视频你懂得| 一区二区三区欧美| 欧美电影免费观看高清完整版 | 久久久青草青青国产亚洲免观| 日日夜夜精品免费视频| 欧美日韩一本到| 午夜视频在线观看一区| 666欧美在线视频| 午夜欧美在线一二页| 在线成人小视频| 激情综合色播五月| 日韩欧美成人午夜| 精品一区二区三区免费视频| 欧美精品一区二区蜜臀亚洲| 国产精品一级片| 亚洲欧洲在线观看av| 91女厕偷拍女厕偷拍高清| 亚洲免费av网站| 欧美人与禽zozo性伦| 日本免费在线视频不卡一不卡二| 欧美一卡二卡三卡| 精品一区二区国语对白| 国产午夜精品久久久久久免费视 | 26uuu色噜噜精品一区| 国产精品99精品久久免费| 国产精品国产三级国产有无不卡| 91精品福利在线| 麻豆国产精品官网| 国产精品网曝门| 欧美午夜寂寞影院| 国内精品在线播放| 日韩伦理av电影| 欧美久久久久久久久久| 国产综合色在线| 中文字幕一区二区三区色视频| 在线一区二区视频| 久久99国产精品久久99| 国产精品久久久久久久久图文区| 欧美日韩专区在线| 国产精品香蕉一区二区三区| 成人免费在线播放视频| 日韩欧美三级在线| 99久久精品免费看| 久久精品国产亚洲高清剧情介绍| 中文子幕无线码一区tr | 色综合久久中文字幕综合网| 亚洲综合在线视频| 久久久久国产精品麻豆ai换脸 | 久久av资源网| 欧美韩国日本综合| 91麻豆精品国产91久久久久久| 国产福利精品导航| 日本vs亚洲vs韩国一区三区| 久久婷婷国产综合国色天香| 欧美三级电影网| 色婷婷综合久久久中文字幕| 91原创在线视频| 色悠悠亚洲一区二区| 国产a级毛片一区| 99免费精品视频| 色综合久久久久久久久| 欧美午夜电影网| 欧美一区二区三区免费观看视频 | 一区二区视频在线| 一区二区三区产品免费精品久久75| 一区二区三区四区激情| 亚洲国产你懂的| 男人的天堂久久精品| 精品亚洲porn| 99久久综合精品| 欧美性感一区二区三区| 欧美一区二区三区播放老司机| ww久久中文字幕| 亚洲欧洲av另类| 亚洲图片欧美综合| 激情久久五月天| gogo大胆日本视频一区| 欧美无乱码久久久免费午夜一区| 欧美一区二区性放荡片| 国产午夜精品久久久久久免费视 | 亚洲大片精品永久免费| 美国av一区二区| 成人性色生活片| 欧美午夜免费电影| 欧美精品一区二区三区一线天视频 | www.日本不卡| 欧美二区在线观看| 国产欧美日韩精品一区| 亚洲一线二线三线视频| 韩国精品主播一区二区在线观看 | 国产香蕉久久精品综合网| 亚洲精选免费视频| 理论片日本一区| 色婷婷综合久久久久中文一区二区| 67194成人在线观看| 中国av一区二区三区| 日韩电影在线一区二区三区| 成人h精品动漫一区二区三区| 欧美三级电影精品| 中文字幕成人在线观看| 蜜桃视频第一区免费观看| 99热在这里有精品免费| 欧美大片免费久久精品三p| 亚洲黄色av一区| 国产sm精品调教视频网站| 欧美久久久久久久久久| 日韩伦理av电影| 国产盗摄精品一区二区三区在线| 欧美日韩1234| 亚洲欧美激情在线| 欧美老人xxxx18| 国产精品初高中害羞小美女文| 蜜臀精品一区二区三区在线观看| 91丝袜美女网| 国产色综合一区| 久久99国产精品尤物| 91精品国产综合久久久久久久久久 | 精品福利一二区| 亚洲成人免费在线观看| 色婷婷综合久久久| 国产精品久久久久一区二区三区共| 麻豆精品新av中文字幕| 欧美人与z0zoxxxx视频| 一区二区三区精品| kk眼镜猥琐国模调教系列一区二区 | 亚洲精品成人a在线观看| 成人做爰69片免费看网站| 久久综合九色综合97婷婷| 日本午夜精品视频在线观看| 欧美日本乱大交xxxxx| 一区二区三区**美女毛片| 成人aa视频在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品99久久久久久久女警| 精品欧美乱码久久久久久1区2区| 日本欧美在线观看| 欧美日韩免费一区二区三区 | 成人欧美一区二区三区1314| 国产成人在线视频网址| 国产三级欧美三级日产三级99| 久久99精品国产.久久久久久| 日韩欧美综合一区| 久久99精品一区二区三区三区| 日韩欧美不卡在线观看视频| 美女脱光内衣内裤视频久久网站| 51久久夜色精品国产麻豆| 爽好多水快深点欧美视频| 欧美精品电影在线播放| 日韩中文字幕91| 欧美va在线播放| 豆国产96在线|亚洲| 日本一区二区综合亚洲| 91啦中文在线观看| 亚洲韩国精品一区| 日韩一区二区免费在线观看| 美女一区二区三区在线观看| 久久精品人人做人人综合| 成人综合在线观看| 最新热久久免费视频| 欧美午夜精品理论片a级按摩| 天堂久久久久va久久久久| 精品国产髙清在线看国产毛片| 国产一区 二区 三区一级| 国产精品毛片久久久久久久| 91久久香蕉国产日韩欧美9色| 午夜精品123| 国产午夜精品一区二区三区嫩草| 91免费版在线| 麻豆国产精品777777在线|