#ifndef __AMSCULIB2_HPP__
#define __AMSCULIB2_HPP__

//Std Lib Includes
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <time.h>
#include <new>

#include <cuda_runtime_api.h> //where all the cuda functions live
#include <cuda_runtime.h>
#include <cuda.h>

//Dependencies

//Predeclarations
class cuvect2;
class cuvect3;
class cuvect4;
class cuvec2f;
class cuvec3f;
class cuvec4f;

//Need a way to define the same symbols using both host and device code
//A solution was found here: https://stackoverflow.com/questions/9457572/cuda-host-and-device-using-same-constant-memory
#ifdef __CUDA_ARCH__
#define AMSCU_CONST __constant__
#else
#define AMSCU_CONST
#endif

namespace amscuda
{

    //default thread and block execution
    AMSCU_CONST static const int amscu_defnblocks = 256;
    AMSCU_CONST static const int amscu_defnthreads = 512;

    //default numthreads to execute on cpu
    AMSCU_CONST static const int amscu_defcputhreads = 8;

}; //end namespace amscuda

//Components
#include <amsculib2/amscu_cudafunctions.hpp>
#include <amsculib2/amscumath.hpp>
#include <amsculib2/amscu_comp64.hpp>
#include <amsculib2/amscu_comp128.hpp>
#include <amsculib2/cuvect2.hpp>
#include <amsculib2/cuvect3.hpp>
#include <amsculib2/cuvect4.hpp>
#include <amsculib2/cuvec2f.hpp>
#include <amsculib2/cuvec3f.hpp>
#include <amsculib2/cuvec4f.hpp>
#include <amsculib2/amscugeom.hpp>
#include <amsculib2/amscuarray.hpp>
#include <amsculib2/amscuda_binarrrw.hpp>
#include <amsculib2/amscu_random.hpp>

#include <amsculib2/amscuarray_dops.hpp>

#include <amsculib2/amscurarray.cuh>




#endif

