diff --git a/src/lib/StdAdaptors.h b/src/lib/StdAdaptors.h index d1223bded..c458faa2f 100644 --- a/src/lib/StdAdaptors.h +++ b/src/lib/StdAdaptors.h @@ -186,10 +186,10 @@ struct StdStringAdapt }; inline StdStringAdapt mkStringAdapt(char *szString, int iMaxLength, StdCompiler::RawCompileType eRawType = StdCompiler::RCT_Escaped) { return StdStringAdapt(szString, iMaxLength, eRawType); } -#define mkStringAdaptM(szString) mkStringAdapt(szString, (sizeof(szString) / sizeof(*szString)) - 1) -#define mkStringAdaptMA(szString) mkStringAdapt(szString, (sizeof(szString) / sizeof(*szString)) - 1, StdCompiler::RCT_All) -#define mkStringAdaptMI(szString) mkStringAdapt(szString, (sizeof(szString) / sizeof(*szString)) - 1, StdCompiler::RCT_Idtf) -#define mkStringAdaptMIE(szString) mkStringAdapt(szString, (sizeof(szString) / sizeof(*szString)) - 1, StdCompiler::RCT_IdtfAllowEmpty) +template inline StdStringAdapt mkStringAdaptM(char (&szString)[size]) { return mkStringAdapt(szString, size); } +template inline StdStringAdapt mkStringAdaptMA(char (&szString)[size]) { return mkStringAdapt(szString, size, StdCompiler::RCT_All); } +template inline StdStringAdapt mkStringAdaptMI(char (&szString)[size]) { return mkStringAdapt(szString, size, StdCompiler::RCT_Idtf); } +template inline StdStringAdapt mkStringAdaptMIE(char (&szString)[size]) { return mkStringAdapt(szString, size, StdCompiler::RCT_IdtfAllowEmpty); } // * std::string adaptor struct StdStdStringAdapt @@ -224,7 +224,12 @@ struct StdRawAdapt }; inline StdRawAdapt mkRawAdapt(void *pData, size_t iSize, StdCompiler::RawCompileType eRawType = StdCompiler::RCT_Escaped) { return StdRawAdapt(pData, iSize, eRawType); } -#define mkRawAdaptM(X) mkRawAdapt(&X, sizeof(X)) +template +inline StdRawAdapt mkRawAdaptM(T &val) +{ + static_assert(std::is_trivially_copyable::value, "StdRawAdapt: type must be trivially copyable"); + return mkRawAdapt(&val, sizeof(val)); +} // * Integer Adaptor // Stores Integer-like datatypes (Enumerations) @@ -326,10 +331,12 @@ struct StdArrayAdapt }; template inline StdArrayAdapt mkArrayAdapt(T *pArray, int iSize) { return StdArrayAdapt(pArray, iSize); } -#define mkArrayAdaptM(A) mkArrayAdapt(A, sizeof(A) / sizeof(*(A))) +template +inline StdArrayAdapt mkArrayAdaptM(T (&array)[size]) { return StdArrayAdapt(array, size); } template inline StdArrayAdapt mkArrayAdaptMap(T *pArray, int iSize, M && map) { return StdArrayAdapt(pArray, iSize, std::forward(map)); } -#define mkArrayAdaptMapM(A, M) mkArrayAdaptMap(A, sizeof(A) / sizeof(*(A)), M) +template +inline StdArrayAdapt mkArrayAdaptMapM(T (&array)[size], M && map) { return StdArrayAdapt(array, size, std::forward(map)); } // * Array Adaptor (defaulting) // Stores a separated list, sets defaults if a value or separator is missing. @@ -378,10 +385,12 @@ struct StdArrayDefaultAdapt }; template inline StdArrayDefaultAdapt mkArrayAdapt(T *pArray, size_t iSize, const D &rDefault) { return StdArrayDefaultAdapt(pArray, iSize, rDefault); } -#define mkArrayAdaptDM(A, D) mkArrayAdapt(A, sizeof(A) / sizeof(*(A)), D) +template +inline StdArrayDefaultAdapt mkArrayAdaptDM(T (&array)[size], const D &rDefault) { return StdArrayDefaultAdapt(array, size, rDefault); } template inline StdArrayDefaultAdapt mkArrayAdaptMap(T *pArray, size_t iSize, const D &rDefault, M map) { return StdArrayDefaultAdapt(pArray, iSize, rDefault, map); } -#define mkArrayAdaptMapDM(A, D, M) mkArrayAdaptMap(A, sizeof(A) / sizeof(*(A)), D, M) +template +inline StdArrayDefaultAdapt mkArrayAdaptMapDM(T (&array)[size], const D &rDefault, M map) { return StdArrayDefaultAdapt(array, size, rDefault, map); } // * Array Adaptor (defaulting to another array) // Stores a separated list, sets defaults if a value or separator is missing. @@ -430,10 +439,12 @@ struct StdArrayDefaultArrayAdapt }; template inline StdArrayDefaultArrayAdapt mkArrayAdaptDefArr(T *pArray, size_t iSize, const D &rDefault) { return StdArrayDefaultArrayAdapt(pArray, iSize, rDefault); } -#define mkArrayAdaptDMA(A, D) mkArrayAdaptDefArr(A, sizeof(A) / sizeof(*(A)), D) +template +inline StdArrayDefaultArrayAdapt mkArrayAdaptDMA(T (&array)[size], const D &rDefault) { return StdArrayDefaultArrayAdapt(array, size, rDefault); } template inline StdArrayDefaultArrayAdapt mkArrayAdaptDefArrMap(T *pArray, size_t iSize, const D &rDefault, const M &map) { return StdArrayDefaultArrayAdapt(pArray, iSize, rDefault, map); } -#define mkArrayAdaptDMAM(A, D, M) mkArrayAdaptDefArrMap(A, sizeof(A) / sizeof(*(A)), D, M) +template +inline StdArrayDefaultArrayAdapt mkArrayAdaptDMAM(T (&array)[size], const D &rDefault, const M &map) { return StdArrayDefaultArrayAdapt(array, size, rDefault, map); } // * Insertion Adaptor // Compile a value before / after another