00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024
00025 #include "bitmap_t.h"
00026
00027
00028
00029
00030 bitmap_t::bitmap_t(size_t number_of_pieces)
00031 :m_bitmap(NULL)
00032 ,m_bitmap_size(0)
00033 ,m_number_of_pieces(number_of_pieces)
00034 {
00035 m_bitmap_size = number_of_pieces / 8;
00036 if (number_of_pieces % 8)
00037 m_bitmap_size++;
00038 m_bitmap = new unsigned char[m_bitmap_size];
00039 memset(m_bitmap, 0, m_bitmap_size);
00040 }
00041
00042
00043 bitmap_t::~bitmap_t()
00044 {
00045 if (m_bitmap)
00046 delete[] m_bitmap;
00047 }
00048
00049
00050 void bitmap_t::set(size_t piece)
00051 {
00052 size_t n = piece / 8;
00053 int bit[] = {128,64,32,16,8,4,2,1};
00054 m_bitmap[n] |= bit[piece % 8];
00055 }
00056
00057
00058 void bitmap_t::Load(const std::string& filename)
00059 {
00060 FILE *fil = fopen(filename.c_str(), "rb");
00061 if (fil)
00062 {
00063 fread(m_bitmap, 1, m_bitmap_size, fil);
00064 fclose(fil);
00065 }
00066 }
00067
00068
00069 void bitmap_t::Save(const std::string& filename)
00070 {
00071 FILE *fil = fopen(filename.c_str(), "wb");
00072 if (fil)
00073 {
00074 fwrite(m_bitmap, 1, m_bitmap_size, fil);
00075 fclose(fil);
00076 }
00077 }
00078
00079
00080 bool bitmap_t::IsSet(size_t piece)
00081 {
00082 size_t n = piece / 8;
00083 int bit[] = {128,64,32,16,8,4,2,1};
00084 return (m_bitmap[n] & bit[piece % 8]) ? true : false;
00085 }
00086
00087
00088 size_t bitmap_t::GetSet()
00089 {
00090 size_t q = 0;
00091 for (size_t i = 0; i < m_number_of_pieces; i++)
00092 if (IsSet(i))
00093 q++;
00094 return q;
00095 }
00096
00097