当前位置:网站首页>Tar source code analysis Part 2
Tar source code analysis Part 2
2022-07-04 06:36:00 【Tao song remains the same】
bitmap It's a bitmap , Essential when dealing with big data , Let's look at the implementation :
#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;
}
// Check version
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;
}
边栏推荐
- Summary of leetcode BFS question brushing
- ABCD four sequential execution methods, extended application
- thread priority
- [March 3, 2019] MAC starts redis
- AWT common components, FileDialog file selection box
- tcp socket 的 recv 如何接收指定长度消息?
- Layoutmanager layout manager: flowlayout, borderlayout, GridLayout, gridbaglayout, CardLayout, BoxLayout
- Mysql 45讲学习笔记(十三)表数据删掉一半,表文件大小不变
- Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)
- Arcpy 利用updatelayer函数改变图层的符号系统
猜你喜欢
R statistical mapping - random forest classification analysis and species abundance difference test combination diagram
List of top ten professional skills required for data science work
AWT common components, FileDialog file selection box
Arcpy 利用updatelayer函数改变图层的符号系统
2022 Xinjiang's latest eight members (Safety Officer) simulated examination questions and answers
uniapp 自定义环境变量
746. Climb stairs with minimum cost
InputStream/OutputStream(文件的输入输出)
Another company raised the price of SAIC Roewe new energy products from March 1
Json Web token - jwt vs. Traditional session login Authentication
随机推荐
After the festival, a large number of people change careers. Is it still time to be 30? Listen to the experience of the past people
1、 Relevant theories and tools of network security penetration testing
Learning multi-level structural information for small organ segmentation
运算符<< >>傻瓜式测试用例
How to realize multi account login of video platform members
The sorting in C language realizes the number sorting method from small to large
ES6 modularization
2022 Xinjiang's latest eight members (Safety Officer) simulated examination questions and answers
Webrtc quickly set up video call and video conference
Overview of convolutional neural network structure optimization
How to avoid JVM memory leakage?
C realize Snake games
Variables d'environnement personnalisées uniapp
Download kicad on Alibaba cloud image station
What is tweeman's law?
Can the out of sequence message complete TCP three handshakes
2022.7.2-----leetcode.871
Modify TCP timestamp to optimize transmission performance
4G wireless all network solar hydrological equipment power monitoring system bms110
Invalid bound statement (not found): com. example. mapper. TblUserRecordMapper. login