diff --git a/src/include/deepstate/DeepState.hpp b/src/include/deepstate/DeepState.hpp index 25fe0f1..f5572cd 100644 --- a/src/include/deepstate/DeepState.hpp +++ b/src/include/deepstate/DeepState.hpp @@ -153,6 +153,42 @@ class Symbolic { template class Symbolic {}; +template +class SymbolicLinearContainer { + public: + DEEPSTATE_INLINE explicit SymbolicLinearContainer(size_t len) + : value(len) { + if (!value.empty()) { + DeepState_SymbolizeData(&(value.front()), &(value.back())); + } + } + + DEEPSTATE_INLINE SymbolicLinearContainer(void) { + value.reserve(32); + value.resize(DeepState_SizeInRange(0, 32)); // Avoids symbolic `malloc`. + } + + DEEPSTATE_INLINE operator T (void) const { + return value; + } + + T value; +}; + +template <> +class Symbolic : public SymbolicLinearContainer { + using SymbolicLinearContainer::SymbolicLinearContainer; +}; + +template <> +class Symbolic : public SymbolicLinearContainer { + using SymbolicLinearContainer::SymbolicLinearContainer; +}; + +template +class Symbolic> : + public SymbolicLinearContainer> {}; + #define MAKE_SYMBOL_SPECIALIZATION(Tname, tname) \ template <> \ class Symbolic { \ @@ -279,40 +315,6 @@ static T Pump(T val, unsigned max=10) { return Minimize(val); } -template -class SymbolicLinearContainer { - public: - DEEPSTATE_INLINE explicit SymbolicLinearContainer(size_t len) - : value(len) { - if (!value.empty()) { - DeepState_SymbolizeData(&(value.front()), &(value.back())); - } - } - - DEEPSTATE_INLINE SymbolicLinearContainer(void) - : SymbolicLinearContainer(Pump(DeepState_SizeInRange(0, 32), 32)) {} - - DEEPSTATE_INLINE operator T (void) const { - return value; - } - - T value; -}; - -template <> -class Symbolic : public SymbolicLinearContainer { - using SymbolicLinearContainer::SymbolicLinearContainer; -}; - -template <> -class Symbolic : public SymbolicLinearContainer { - using SymbolicLinearContainer::SymbolicLinearContainer; -}; - -template -class Symbolic> : - public SymbolicLinearContainer> {}; - template inline static void ForAll(void (*func)(Args...)) { func(Symbolic()...);