From 400eed729386b8fe7baa3448a99c35cdc5830d44 Mon Sep 17 00:00:00 2001 From: echizen_tm Date: Sun, 22 Jan 2017 20:32:59 +0900 Subject: [PATCH] mv fixed_length_vector class to cds/. --- chapter_03/CMakeLists.txt | 1 + chapter_03/cds/fixed_length_vector.cpp | 49 +++++++++++++++++++ chapter_03/cds/fixed_length_vector.h | 24 ++++++++++ chapter_03/cds/sampled_pointers.cpp | 4 ++ chapter_03/cds/sampled_pointers.h | 1 + chapter_03/fixed_length_vector_sample.cpp | 58 +---------------------- chapter_03/sampled_pointers_sample.cpp | 2 + 7 files changed, 82 insertions(+), 57 deletions(-) create mode 100644 chapter_03/cds/fixed_length_vector.cpp create mode 100644 chapter_03/cds/fixed_length_vector.h diff --git a/chapter_03/CMakeLists.txt b/chapter_03/CMakeLists.txt index 1f063b3..244f6fb 100644 --- a/chapter_03/CMakeLists.txt +++ b/chapter_03/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable( fixed_length_vector_sample fixed_length_vector_sample.cpp cds/bit_vector.cpp + cds/fixed_length_vector.cpp ) add_executable( sampled_pointers_sample diff --git a/chapter_03/cds/fixed_length_vector.cpp b/chapter_03/cds/fixed_length_vector.cpp new file mode 100644 index 0000000..814d0d3 --- /dev/null +++ b/chapter_03/cds/fixed_length_vector.cpp @@ -0,0 +1,49 @@ +#include "fixed_length_vector.h" + + +namespace cds { + unsigned int fixed_length_vector::get_bit_index(unsigned int index) { + return ( + (this->is_rapid && this->rest_size_of_a_cell > 0) ? + index / this->elements_in_a_cell * this->bv.cell_size + index % this->elements_in_a_cell * this->length : + index * this->length + ); + } + + fixed_length_vector::fixed_length_vector(unsigned int length, unsigned int size, bool is_rapid) { + this->length = length; + this->is_rapid = is_rapid; + this->elements_in_a_cell = bv.cell_size / this->length; + this->rest_size_of_a_cell = bv.cell_size % this->length; + resize(size); + } + + void fixed_length_vector::resize(unsigned int size) { + this->size = size; + this->bv.resize(this->get_bit_index(this->size)); + } + + unsigned int fixed_length_vector::vector_size() { + return this->bv.vector_size(); + } + + unsigned int fixed_length_vector::read(unsigned int index) { + unsigned int bit_index = this->get_bit_index(index); + + if (this->is_rapid || this->rest_size_of_a_cell == 0) { + return this->bv.bits_read_from_a_cell(bit_index, bit_index + this->length); + } else { + return this->bv.bits_read(bit_index, bit_index + this->length); + } + } + + void fixed_length_vector::write(unsigned int index, unsigned int value) { + unsigned int bit_index = this->get_bit_index(index); + + if (this->is_rapid || this->rest_size_of_a_cell == 0) { + this->bv.bits_write_to_a_cell(bit_index, bit_index + this->length, value); + } else { + this->bv.bits_write(bit_index, bit_index + this->length, value); + } + } +} diff --git a/chapter_03/cds/fixed_length_vector.h b/chapter_03/cds/fixed_length_vector.h new file mode 100644 index 0000000..380c951 --- /dev/null +++ b/chapter_03/cds/fixed_length_vector.h @@ -0,0 +1,24 @@ +#include "bit_vector.h" + + +namespace cds { + class fixed_length_vector { + bit_vector bv; + unsigned int elements_in_a_cell; + unsigned int rest_size_of_a_cell; + + unsigned int get_bit_index(unsigned int index); + + public: + unsigned int length; + unsigned int size; + bool is_rapid; + + fixed_length_vector(unsigned int length, unsigned int size = 0, bool is_rapid = false); + + void resize(unsigned int size); + unsigned int vector_size(); + unsigned int read(unsigned int index); + void write(unsigned int index, unsigned int value); + }; +} diff --git a/chapter_03/cds/sampled_pointers.cpp b/chapter_03/cds/sampled_pointers.cpp index f2b82dd..4fdc420 100644 --- a/chapter_03/cds/sampled_pointers.cpp +++ b/chapter_03/cds/sampled_pointers.cpp @@ -7,6 +7,10 @@ namespace cds { this->size = 0; } + unsigned int sampled_pointers::vector_size() { + return this->bv.vector_size() + this->samples.size(); + } + unsigned int sampled_pointers::read(unsigned int index) { unsigned int begin = this->samples[index / this->rate]; unsigned int values_to_read = index % this->rate; diff --git a/chapter_03/cds/sampled_pointers.h b/chapter_03/cds/sampled_pointers.h index c196ecf..1a3a903 100644 --- a/chapter_03/cds/sampled_pointers.h +++ b/chapter_03/cds/sampled_pointers.h @@ -13,6 +13,7 @@ namespace cds { sampled_pointers(unsigned int rate = 4); + unsigned int vector_size(); unsigned int read(unsigned int index); void push_back(unsigned int value); }; diff --git a/chapter_03/fixed_length_vector_sample.cpp b/chapter_03/fixed_length_vector_sample.cpp index d03633c..3c53f1b 100644 --- a/chapter_03/fixed_length_vector_sample.cpp +++ b/chapter_03/fixed_length_vector_sample.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "cds/bit_vector.h" +#include "cds/fixed_length_vector.h" using namespace std; @@ -11,62 +11,6 @@ using namespace std::chrono; using namespace cds; -class fixed_length_vector { - unsigned int length; - unsigned int size; - bit_vector bv; - bool is_rapid; - unsigned int cell_rest_size; - unsigned int elements_in_a_cell; - - unsigned int get_bit_index(unsigned int index) { - return ( - (is_rapid && cell_rest_size > 0) ? - index / elements_in_a_cell * bv.cell_size + index % elements_in_a_cell * length : - index * length - ); - } - unsigned int bits_read(unsigned int begin, unsigned int end) { - if (is_rapid || bv.is_in_a_cell(begin, end)) { - return bv.bits_read_from_a_cell(begin, end); - } else { - return bv.bits_read_from_two_cells(begin, end); - } - } - void bits_write(unsigned int begin, unsigned int end, unsigned int value) { - if (is_rapid || bv.is_in_a_cell(begin, end)) { - bv.bits_write_to_a_cell(begin, end, value); - } else { - bv.bits_write_to_two_cells(begin, end, value); - } - } - -public: - fixed_length_vector(unsigned int length, unsigned int size = 0, bool is_rapid = false) { - this->length = length; - this->is_rapid = is_rapid; - elements_in_a_cell = bv.cell_size / length; - cell_rest_size = bv.cell_size % length; - resize(size); - } - unsigned int read(unsigned int index) { - unsigned int bit_index = get_bit_index(index); - return bits_read(bit_index, bit_index + length); - } - void write(unsigned int index, unsigned int value) { - unsigned int bit_index = get_bit_index(index); - bits_write(bit_index, bit_index + length, value); - } - void resize(unsigned int size) { - this->size = size; - bv.resize(get_bit_index(size)); - } - unsigned int vector_size() { - return bv.vector_size(); - } -}; - - bool run_vector(int length, int num) { vector vec(num); vector range(num); diff --git a/chapter_03/sampled_pointers_sample.cpp b/chapter_03/sampled_pointers_sample.cpp index d36cfb0..f2a411b 100644 --- a/chapter_03/sampled_pointers_sample.cpp +++ b/chapter_03/sampled_pointers_sample.cpp @@ -22,5 +22,7 @@ int main(int argc, char **argv) { } cout << endl; + cout << "vector size: " << sp.vector_size() << endl; + return 0; }