- Created type traits header including macros to make checks for types having any operator or member function, and seeded it with every operator operating on the same type.
For function and/or type combinations not already handled, creating a new type traits struct is just a single line of code.
- Updated coroutine to use the new type traits header and removed the explicit operator() check
- Added alternative to SPRAWL_THROW_EXCEPTION - SPRAWL_THROW_EXCEPTION_OR_ABORT, which as it sounds, will either throw the exception if exceptions are enabled, otherwise will print the message and abort. This is for cases where returning a value reliably isn't possible, such as in constructors or code that returns a template type that may not be default constructible.
- Added a layer of safety around coroutines; trying to call the various functions that pause the current coroutine will now throw an exception (if enabled) or abort (if not) if you try to call the wrong pause function (i.e., calling an empty yield() on a coroutine that's supposed to return a value)
- Added ability to determine what type a CoroutineBase object actually is underneath
- Added function in logging to flush one specific category instead of flushing everything