当前位置:网站首页>tars源码分析之2
tars源码分析之2
2022-07-04 06:33:00 【涛歌依旧】
bitmap就是位图,在处理大数据时必不可少,来看下实现:
#include "util/tc_bitmap.h"
#include "util/tc_common.h"
#include <cassert>
#include <string.h>
#include <iostream>
namespace tars
{
const int TC_BitMap::BitMap::_magic_bits[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
size_t TC_BitMap::BitMap::calcMemSize(size_t iElementCount)
{
assert(iElementCount > 0);
iElementCount--;
size_t iMemSize = iElementCount/8+1;
iMemSize += sizeof(tagBitMapHead);
return iMemSize;
}
void TC_BitMap::BitMap::create(void *pAddr, size_t iSize)
{
memset((char*)pAddr, 0, iSize);
_pHead = static_cast<tagBitMapHead*>(pAddr);
_pHead->_cVersion = BM_VERSION;
_pHead->_iMemSize = iSize;
_pData = (unsigned char*)pAddr + sizeof(tagBitMapHead);
}
int TC_BitMap::BitMap::connect(void *pAddr, size_t iSize)
{
_pHead = static_cast<tagBitMapHead*>(pAddr);
if(_pHead->_cVersion != BM_VERSION)
{
return -1;
}
if(iSize != _pHead->_iMemSize)
{
return -2;
}
_pData = (unsigned char*)pAddr + sizeof(tagBitMapHead);
return 0;
}
int TC_BitMap::BitMap::get(size_t i)
{
if(i/8 >= (_pHead->_iMemSize-sizeof(tagBitMapHead)))
{
return -1;
}
unsigned char* p =_pData + i/8;
return _get_bit(*p, i%8)>0?1:0;
}
int TC_BitMap::BitMap::set(size_t i)
{
if(i/8 >= (_pHead->_iMemSize-sizeof(tagBitMapHead)))
{
return -1;
}
unsigned char* p=(unsigned char*)_pData + i/8;
*p = _set_bit(*p, i%8);
return (int)(*p)>0?1:0;
}
int TC_BitMap::BitMap::clear(size_t i)
{
if(i/8 >= (_pHead->_iMemSize-sizeof(tagBitMapHead)))
{
return -1;
}
unsigned char* p = (unsigned char*)_pData + i/8;
*p = _clear_bit(*p, i%8);
return (int)(*p)>0?1:0;
}
int TC_BitMap::BitMap::clear4all()
{
memset(_pData, 0, _pHead->_iMemSize-sizeof(tagBitMapHead));
return 0;
}
int TC_BitMap::BitMap::dump2file(const string &sFile)
{
FILE *fp = fopen(sFile.c_str(), "wb");
if(fp == NULL)
{
return -1;
}
size_t ret = fwrite((void*)_pHead, 1, _pHead->_iMemSize, fp);
fclose(fp);
if(ret == _pHead->_iMemSize)
{
return 0;
}
return -1;
}
int TC_BitMap::BitMap::load5file(const string &sFile)
{
FILE *fp = fopen(sFile.c_str(), "rb");
if(fp == NULL)
{
return -1;
}
fseek(fp, 0L, SEEK_END);
size_t fs = ftell(fp);
if(fs != _pHead->_iMemSize)
{
fclose(fp);
return -2;
}
fseek(fp, 0L, SEEK_SET);
size_t iSize = 1024*1024*10;
size_t iLen = 0;
char *pBuffer = new char[iSize];
while(true)
{
int ret = fread(pBuffer, 1, iSize, fp);
if(ret == 0)
{
break;
}
//检查版本
if(iLen == 0)
{
tagBitMapHead *tmp = (tagBitMapHead*)pBuffer;
if(tmp->_cVersion != BM_VERSION)
{
fclose(fp);
delete[] pBuffer;
return -3;
}
if(tmp->_iMemSize != _pHead->_iMemSize)
{
fclose(fp);
delete[] pBuffer;
return -2;
}
}
memcpy((char*)_pHead + iLen, pBuffer, ret);
iLen += ret;
}
fclose(fp);
delete[] pBuffer;
if(iLen != _pHead->_iMemSize)
{
return -2;
}
return 0;
}
边栏推荐
- JSON Web Token----JWT和傳統session登錄認證對比
- 2022 wechat enterprise mailbox login entry introduction, how to open and register enterprise wechat enterprise mailbox?
- Operator < <> > fool test case
- How to implement cross domain requests
- C language exercises (recursion)
- Bicolor case
- 运算符<< >>傻瓜式测试用例
- Considerations for testing a website
- How to choose the middle-aged crisis of the testing post? Stick to it or find another way out? See below
- Tsinghua University product: penalty gradient norm improves generalization of deep learning model
猜你喜欢
How to choose the middle-aged crisis of the testing post? Stick to it or find another way out? See below
C realize Snake games
C language - Blue Bridge Cup - Snake filling
Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)
Arcpy 利用updatelayer函数改变图层的符号系统
Sleep quality today 78 points
[MySQL] introduction, function, creation, view, deletion and modification of database view (with exercises)
Distributed cap theory
How does apscheduler set tasks not to be concurrent (that is, execute the next task after the first one)?
17-18. Dependency scope and life cycle plug-ins
随机推荐
What is Gibson's law?
What is tweeman's law?
Fundamentals of SQL database operation
Dimension and format of data
Detectron: train your own data set -- convert your own data format to coco format
1、 Relevant theories and tools of network security penetration testing
AWT introduction
27-31. Dependency transitivity, principle
Learn about the Internet of things protocol WiFi ZigBee Bluetooth, etc. --- WiFi and WiFi protocols start from WiFi. What do we need to know about WiFi protocol itself?
Tsinghua University product: penalty gradient norm improves generalization of deep learning model
Variables d'environnement personnalisées uniapp
2022.7.2-----leetcode. eight hundred and seventy-one
Explain in one sentence what social proof is
Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)
The solution of win11 taskbar right click without Task Manager - add win11 taskbar right click function
Realize IIC data / instruction interaction with micro batg135
The width of the picture in rich text used by wechat applet exceeds the problem
ABCD four sequential execution methods, extended application
微信小程序使用rich-text中图片宽度超出问题
How to use multithreading to export excel under massive data? Source code attached!