TOC.h
1 /* Copyright (C) 2020 IBM Corp.
2  * This program is Licensed under the Apache License, Version 2.0
3  * (the "License"); you may not use this file except in compliance
4  * with the License. You may obtain a copy of the License at
5  * http://www.apache.org/licenses/LICENSE-2.0
6  * Unless required by applicable law or agreed to in writing, software
7  * distributed under the License is distributed on an "AS IS" BASIS,
8  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9  * See the License for the specific language governing permissions and
10  * limitations under the License. See accompanying LICENSE file.
11  */
12 
13 #ifndef TOC_H
14 #define TOC_H
15 
16 #include <iostream>
17 #include <fstream>
18 
19 // Table of Contents or Index or Catalog
20 class TOC
21 {
22 
23 private:
24  uint64_t rows;
25  uint64_t cols;
26  std::unique_ptr<uint64_t[]> idx;
27 
28 public:
29  TOC() = default;
30 
31  TOC(uint64_t r, uint64_t c) :
32  rows(r), cols(c), idx(std::make_unique<uint64_t[]>(r * c))
33  {}
34 
35  void print(std::ostream& out = std::cout) const
36  {
37  out << "Rows, Cols: " << rows << ", " << cols << std::endl;
38  for (uint64_t i = 0; i < rows; ++i) {
39  for (uint64_t j = 0; j < cols; ++j) {
40  out << getIdx(i, j) << " ";
41  }
42  out << std::endl;
43  }
44  }
45 
46  uint64_t getRows() const { return this->rows; }
47 
48  uint64_t getCols() const { return this->cols; }
49 
50  uint64_t getIdx(int i, int j) const { return this->idx[i * cols + j]; }
51 
52  void setIdx(int i, int j, uint64_t value) { this->idx[i * cols + j] = value; }
53 
54  void write(std::ostream& s)
55  {
56  s.write(reinterpret_cast<char*>(&rows), sizeof(uint64_t));
57  s.write(reinterpret_cast<char*>(&cols), sizeof(uint64_t));
58  s.write(reinterpret_cast<char*>(idx.get()), sizeof(uint64_t) * rows * cols);
59  }
60 
61  void read(std::istream& s)
62  {
63  s.read(reinterpret_cast<char*>(&rows), sizeof(uint64_t));
64  s.read(reinterpret_cast<char*>(&cols), sizeof(uint64_t));
65  // Deallocate existing, allocate new.
66  idx.reset(new uint64_t[rows * cols]);
67  s.read(reinterpret_cast<char*>(idx.get()), sizeof(uint64_t) * rows * cols);
68  }
69 
70  long memorySize() { return sizeof(uint64_t) * (2 + rows * cols); }
71 };
72 
73 #endif // TOC_H
TOC()=default
void write(std::ostream &s)
Definition: TOC.h:54
Definition: TOC.h:21
uint64_t getCols() const
Definition: TOC.h:48
void print(std::ostream &out=std::cout) const
Definition: TOC.h:35
uint64_t getRows() const
Definition: TOC.h:46
void read(std::istream &s)
Definition: TOC.h:61
TOC(uint64_t r, uint64_t c)
Definition: TOC.h:31
long memorySize()
Definition: TOC.h:70
uint64_t getIdx(int i, int j) const
Definition: TOC.h:50
void setIdx(int i, int j, uint64_t value)
Definition: TOC.h:52