Program Listing for File Curve.cuh

Return to documentation for file (include/flamegpu/runtime/detail/curve/Curve.cuh)

#ifndef INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_CUH_
#define INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_CUH_

#ifndef __CUDACC_RTC__
#include <string>
#endif
/*
 * The main cuRVE header file for the CUDA Runtime Variable Environment (cuRVE)
 * Based off the following article http:// www.gamasutra.com/view/news/127915/InDepth_Quasi_CompileTime_String_Hashing.php
 * This file contains definitions common to HostCurve and DeviceCurve
 */
namespace flamegpu {
namespace detail {
namespace curve {

class Curve {
 public:
    typedef int                      Variable;           // !< Typedef for cuRVE variable handle
    typedef unsigned int             VariableHash;       // !< Typedef for cuRVE variable name string hash
    typedef unsigned int             NamespaceHash;      // !< Typedef for cuRVE variable namespace string hash
    static const int MAX_VARIABLES = 512;                // !< Default maximum number of cuRVE variables (must be a power of 2)
    static const VariableHash EMPTY_FLAG = 0;
    template <unsigned int N>
    __device__ __host__ __forceinline__ static VariableHash variableHash(const char(&str)[N]);
#ifndef __CUDACC_RTC__
    __host__ static VariableHash variableRuntimeHash(const std::string &str);
    __host__ static VariableHash variableRuntimeHash(unsigned int num);
#endif
};
struct CurveTable {
    Curve::VariableHash hashes[Curve::MAX_VARIABLES];            // Device array of the hash values of registered variables
    char* variables[Curve::MAX_VARIABLES];                // Device array of pointer to device memory addresses for variable storage
    unsigned int type_size[Curve::MAX_VARIABLES];         // Device array of the types of registered variables
    unsigned int elements[Curve::MAX_VARIABLES];
    unsigned int count[Curve::MAX_VARIABLES];
};

/* TEMPLATE HASHING FUNCTIONS */

template <unsigned int N, unsigned int I> struct CurveStringHash {
    __device__ __host__ inline static Curve::VariableHash Hash(const char(&str)[N]) {
        return (CurveStringHash<N, I - 1>::Hash(str) ^ str[I - 1]) * 16777619u;
    }
};
template <unsigned int N> struct CurveStringHash<N, 1> {
    __device__ __host__ inline static Curve::VariableHash Hash(const char(&str)[N]) {
        return (2166136261u ^ str[0]) * 16777619u;
    }
};

template <unsigned int N>
__device__ __host__ __forceinline__ Curve::VariableHash Curve::variableHash(const char(&str)[N]) {
    return CurveStringHash<N, N>::Hash(str);
}


}  // namespace curve
}  // namespace detail
}  // namespace flamegpu

#endif  // INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_CUH_