From 58a71c55b48b4f4e0b5a97855bf54fdd16910770 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Wed, 6 Dec 2023 00:46:48 +0000 Subject: [PATCH] =?UTF-8?q?doc:=20=E5=87=8F=E5=B0=91=E4=BA=86drivearray?= =?UTF-8?q?=E7=9A=84IO=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/include/drivearray.hpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/backend/include/drivearray.hpp b/backend/include/drivearray.hpp index 2aad38d..a90b0b0 100644 --- a/backend/include/drivearray.hpp +++ b/backend/include/drivearray.hpp @@ -25,7 +25,7 @@ class DriveArray { struct BlockType { DataType data[kDataPerBlock]; }; - char rest[kBlockSize - sizeof(BlockType)]; + char rest[kBlockSize]; static_assert(kBlockSize % kPageSize == 0, "kBlockSize % kPageSize != 0"); std::string file_name; int total_block_number = 0, first_vacant_data_index = 0; @@ -56,11 +56,15 @@ class DriveArray { return cache[block_index]; } int AppEndBlock() { + if (cache.size() == kBufSize) ReleaseOldestCache(); + BlockType *tmp = new BlockType; + // fs.write(reinterpret_cast(tmp), sizeof(BlockType)); + // fs.write(rest, kBlockSize - sizeof(BlockType)); fs.seekp(0, std::ios::end); - BlockType tmp; - fs.write(reinterpret_cast(&tmp), sizeof(BlockType)); - fs.write(rest, kBlockSize - sizeof(BlockType)); + fs.write(rest, kBlockSize); ++total_block_number; + cache[total_block_number] = tmp; + vis_que.push(total_block_number); return total_block_number; } @@ -161,7 +165,8 @@ class DriveArray { blk_ptr->data[i].next_vacant_data_index = index + i + 1; blk_ptr->data[kDataPerBlock - 1].next_vacant_data_index = 0; blk_ptr->data[0].next_vacant_data_index = 0; - blk_ptr->data[0].val = t; + // blk_ptr->data[0].val = t; + std::memmove(&blk_ptr->data[0].val, &t, sizeofT); return index; } else { int block_index = (first_vacant_data_index - 1) / kDataPerBlock + 1; @@ -171,7 +176,8 @@ class DriveArray { first_vacant_data_index = blk_ptr->data[inner_index - 1].next_vacant_data_index; blk_ptr->data[inner_index - 1].next_vacant_data_index = 0; - blk_ptr->data[inner_index - 1].val = t; + // blk_ptr->data[inner_index - 1].val = t; + std::memmove(&blk_ptr->data[inner_index - 1].val, &t, sizeofT); return index; } } @@ -180,14 +186,16 @@ class DriveArray { int block_index = (index - 1) / kDataPerBlock + 1; int inner_index = (index - 1) % kDataPerBlock + 1; BlockType *blk_ptr = OrderBlock(block_index); - blk_ptr->data[inner_index - 1].val = t; + // blk_ptr->data[inner_index - 1].val = t; + std::memmove(&blk_ptr->data[inner_index - 1].val, &t, sizeofT); } void read(T &t, const int index) noexcept { int block_index = (index - 1) / kDataPerBlock + 1; int inner_index = (index - 1) % kDataPerBlock + 1; BlockType *blk_ptr = OrderBlock(block_index); - t = blk_ptr->data[inner_index - 1].val; + // t = blk_ptr->data[inner_index - 1].val; + std::memmove(&t, &blk_ptr->data[inner_index - 1].val, sizeofT); } void Delete(int index) noexcept {