/**
 * @file SparseMatrix
 * @author Skyler Ruiter and Seth Wolfgang
 * @brief IVSparse Sparse Matrix Library
 * @version 0.1
 * @date 2023-07-03
 */

#pragma once

 // Library Constants
#define DELIM 0
#define NUM_META_DATA 6
#define META_DATA_SIZE 24
#define ONE_BYTE_MAX 255
#define TWO_BYTE_MAX 65535
#define FOUR_BYTE_MAX 4294967295

// Parallel Processing Directives (On by default)
#if (defined _OPENMP) && (!defined IVSPARSE_DONT_PARALLEL)
#define IVSPARSE_HAS_OPENMP
#endif
#ifdef IVSPARSE_HAS_OPENMP
#include <Eigen/Core>
#include <atomic>
#include <omp.h>
#endif

// Debugging Directives (Off by default)
#ifndef IVSPARSE_DEBUG_OFF
#define IVSPARSE_DEBUG
#endif

// Library Includes
#include <Eigen/Sparse>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <type_traits>
#include <iomanip>
#include <type_traits>

namespace IVSparse {
 
    const int RowMajor = 0;
    const int ColMajor = 1;

    template <typename T, bool columnMajor>
    class IVCSC;

    template <typename T, typename indexT, bool columnMajor>
    class VCSC;
}


// Class Declarations
#include "src/VCSC/VCSC_SparseMatrix.hpp"
#include "src/IVCSC/IVCSC_SparseMatrix.hpp"

// IVCSC Files
#include "src/IVCSC/IVCSC_Operators.hpp"
#include "src/IVCSC/IVCSC_Private_Methods.hpp"
#include "src/IVCSC/IVCSC_Methods.hpp"
#include "src/IVCSC/IVCSC_Constructors.hpp"
#include "src/IVCSC/IVCSC_BLAS.hpp"

// IVCSC Iterator Files
#include "src/InnerIterators/IVCSC_Iterator.hpp"
#include "src/InnerIterators/IVCSC_Iterator_Methods.hpp"

// VCSC Files
#include "src/VCSC/VCSC_Operators.hpp"
#include "src/VCSC/VCSC_Private_Methods.hpp"
#include "src/VCSC/VCSC_Methods.hpp"
#include "src/VCSC/VCSC_Constructors.hpp"
#include "src/VCSC/VCSC_BLAS.hpp"

// VCSC Iterator Files
#include "src/InnerIterators/VCSC_Iterator.hpp"
#include "src/InnerIterators/VCSC_Iterator_Methods.hpp"
