Glyphi
Glyphi

Reputation: 11

Overloading streaming on the Arduino

Please RTFM me if needed, as so far I may have been searching for the wrong things!

On the Arduino

 Serial << "sdf" << var;

works a treat (with streaming.h referenced), but

#if (CRIPWEB_DEBUG_BITS & DEBUG_CMD)
    Serial <<  F("Run Macro: ") << strMacro << "\n";
#endif

takes three lines and makes the code unreadable.

I'd like to say something along the lines of:

Debug(CRIPWEB_DEBUG_BITS & DEBUG_CMD) << F("Run Macro: ") << strMacro << "\n";

Is this possible? I'd be happier with:

Debug.set(CRIPWEB_DEBUG_BITS & DEBUG_CMD); Debug << F("Run Macro: ") << strMacro << "\n";

I'll worry about size after I've had a go at this!

Many thanks, Glyn

Upvotes: 1

Views: 183

Answers (3)

Ajay
Ajay

Reputation: 18431

I am answering only compile-time solution for the expression:

Serial << "sdf" << var;

Assume Serial is a global instance of class. Let's say instance of class DebugWriter. This class has overloaded operator <<. Now, you can make another class FakeDebugWriter, which will also have operator << implemented, but that would do nothing. Further, you can declare Serial instance as:

#if CRIPWEB_DEBUG_BITS & DEBUG_CMD
DebugWriter Serial;
#else
FakeDebugWriter Serial;
#endif

But it should be noted that Serial<< will still make call to function in case of FakeDebugWriter - though compiler may omit out the function call.

Therefore, it would be better to write debug-logging as function-style macro only. You can craft the macro has do some thing (or something heavy), and another as Do-nothing.

EDIT: After comment from OP. Here is analogues similar example.

SmallInt a, b;

Where SmallInt would be type-defined, depending on value(s) of pre-processor macro (not macro macro).

#if SomeCondition
typedef int SmallInt;
#else
typedef short SmallInt;
#endif

Upvotes: 0

Deduplicator
Deduplicator

Reputation: 45674

The preprocessor would be compile-time, the other would not. You really want the slowdown?

Anyway, if you accept a slightly different syntax, we get pretty near to what you wanted while not giving up on eliminating the useless code at compile-time:

#define COND(cond, ...) ((void)((exp) && (__VA_ARGS__, 0)))

Use as

COND(CRIPWEB_DEBUG_BITS & DEBUG_CMD, Serial <<  F("Run Macro: ") << strMacro << "\n");

Or, if you only ever test that one condition:

#define IFDEBUG(...) ((void)((CRIPWEB_DEBUG_BITS & DEBUG_CMD) && (__VA_ARGS__, 0)))

Use as

IFDEBUG(Serial <<  F("Run Macro: ") << strMacro << "\n");

Upvotes: 1

graham.reeds
graham.reeds

Reputation: 16476

You could write your own class to do exactly that.

Upvotes: 0

Related Questions