File barray-bones.hpp¶
File List > barry > barray-bones.hpp
Go to the documentation of this file
// #include <vector>
// #include <unordered_map>
// #include "typedefs.hpp"
// #include "cell-bones.hpp"
// #include "barraycell-bones.hpp"
#ifndef BARRAY_BONES_HPP
#define BARRAY_BONES_HPP 1
template<typename Cell_Type, typename Data_Type>
class BArrayCell;
template<typename Cell_Type, typename Data_Type>
class BArrayCell_const;
template <typename Cell_Type = bool, typename Data_Type = bool>
class BArray {
friend class BArrayCell<Cell_Type,Data_Type>;
friend class BArrayCell_const<Cell_Type,Data_Type>;
// friend class Support<Cell_Type,Data_Type>;
// friend class StatsCounter<Cell_Type,Data_Type>;
private:
size_t N;
size_t M;
size_t NCells = 0u;
std::vector< Row_type< Cell_Type > > el_ij;
std::vector< Col_type< Cell_Type > > el_ji;
Data_Type * data = nullptr;
bool delete_data = false;
static Cell< Cell_Type > Cell_default;
static const bool dense = false;
public:
bool visited = false;
BArray() : N(0u), M(0u), NCells(0u), el_ij(0u), el_ji(0u) {};
BArray (size_t N_, size_t M_) : N(N_), M(M_), NCells(0u), el_ij(N_), el_ji(M_) {};
BArray (
size_t N_, size_t M_,
const std::vector< size_t > & source,
const std::vector< size_t > & target,
const std::vector< Cell_Type > & value,
bool add = true
);
BArray (
size_t N_, size_t M_,
const std::vector< size_t > & source,
const std::vector< size_t > & target,
bool add = true
);
BArray(const BArray<Cell_Type,Data_Type> & Array_, bool copy_data = false);
BArray<Cell_Type,Data_Type> & operator=(const BArray<Cell_Type,Data_Type> & Array_);
BArray(BArray<Cell_Type,Data_Type> && x) noexcept;
BArray<Cell_Type,Data_Type> & operator=(BArray<Cell_Type,Data_Type> && x) noexcept;
bool operator==(const BArray<Cell_Type,Data_Type> & Array_);
~BArray();
// In principle, copy can be faster by using openmp on the rows
// since those are independent.
// BArray(BArray & A);
void set_data(Data_Type * data_, bool delete_data_ = false);
Data_Type * D_ptr();
const Data_Type * D_ptr() const;
Data_Type & D();
const Data_Type & D() const;
void flush_data();
// Function to access the elements
// bool check_cell
void out_of_range(size_t i, size_t j) const;
Cell_Type get_cell(size_t i, size_t j, bool check_bounds = true) const;
std::vector< Cell_Type > get_col_vec(size_t i, bool check_bounds = true) const;
std::vector< Cell_Type > get_row_vec(size_t i, bool check_bounds = true) const;
void get_col_vec(std::vector< Cell_Type > * x, size_t i, bool check_bounds = true) const;
void get_row_vec(std::vector< Cell_Type > * x, size_t i, bool check_bounds = true) const;
const Row_type< Cell_Type > & row(size_t i, bool check_bounds = true) const;
const Col_type< Cell_Type > & col(size_t i, bool check_bounds = true) const;
Entries<Cell_Type> get_entries() const;
bool is_empty(size_t i, size_t j, bool check_bounds = true) const;
size_t nrow() const noexcept;
size_t ncol() const noexcept;
size_t nnozero() const noexcept;
Cell<Cell_Type> default_val() const;
BArray<Cell_Type,Data_Type> & operator+=(const std::pair<size_t, size_t> & coords);
BArray<Cell_Type,Data_Type> & operator-=(const std::pair<size_t, size_t> & coords);
BArrayCell<Cell_Type,Data_Type> operator()(size_t i, size_t j, bool check_bounds = true);
const Cell_Type operator()(size_t i, size_t j, bool check_bounds = true) const;
void rm_cell(size_t i, size_t j, bool check_bounds = true, bool check_exists = true);
void insert_cell(size_t i, size_t j, const Cell< Cell_Type > & v, bool check_bounds, bool check_exists);
void insert_cell(size_t i, size_t j, Cell< Cell_Type > && v, bool check_bounds, bool check_exists);
void insert_cell(size_t i, size_t j, Cell_Type v, bool check_bounds, bool check_exists);
void swap_cells(
size_t i0, size_t j0, size_t i1, size_t j1, bool check_bounds = true,
int check_exists = CHECK::BOTH,
int * report = nullptr
);
void toggle_cell(size_t i, size_t j, bool check_bounds = true, int check_exists = EXISTS::UKNOWN);
void toggle_lock(size_t i, size_t j, bool check_bounds = true);
void swap_rows(size_t i0, size_t i1, bool check_bounds = true);
void swap_cols(size_t j0, size_t j1, bool check_bounds = true);
void zero_row(size_t i, bool check_bounds = true);
void zero_col(size_t j, bool check_bounds = true);
void transpose();
void clear(bool hard = true);
void resize(size_t N_, size_t M_);
void reserve();
// Advances operators
// void toggle_iterator
// Misc
void print(const char * fmt = nullptr, ...) const;
void print_n(size_t nrow, size_t ncol, const char * fmt = nullptr, ...) const;
BArray<Cell_Type,Data_Type>& operator+=(const BArray<Cell_Type,Data_Type>& rhs);
BArray<Cell_Type,Data_Type>& operator+=(const Cell_Type & rhs);
BArray<Cell_Type,Data_Type>& operator-=(const BArray<Cell_Type,Data_Type>& rhs);
BArray<Cell_Type,Data_Type>& operator-=(const Cell_Type & rhs);
BArray<Cell_Type,Data_Type>& operator/=(const Cell_Type & rhs);
BArray<Cell_Type,Data_Type>& operator*=(const Cell_Type & rhs);
// /**
// * @name Casting between types
// */
// ///@{
// operator BArray<double,bool>() const;
// operator BArray<int,bool>() const;
// operator BArray<size_t,bool>() const;
// operator BArray<bool,bool>() const;
// ///@}
bool is_dense() const noexcept {return dense;};
};
#endif