File tree Expand file tree Collapse file tree 6 files changed +58
-29
lines changed Expand file tree Collapse file tree 6 files changed +58
-29
lines changed Original file line number Diff line number Diff line change 66class NoteLog
77{
88public:
9- /* *************************************************************************/
10- /* !
11- @brief Type used to abstract specific hardware implementation types.
12- */
13- /* *************************************************************************/
14- typedef void * param_t ;
159
1610 virtual ~NoteLog (void ) {}
1711
@@ -36,8 +30,7 @@ class NoteLog
3630 the platform specific log output implementation.
3731*/
3832/* *****************************************************************************/
39- NoteLog * make_note_log (
40- NoteLog::param_t log_parameters
41- );
33+ template <typename T> NoteLog * make_note_log (T & log_parameters);
34+ NoteLog * make_note_log (nullptr_t );
4235
4336#endif // NOTE_LOG_HPP
Original file line number Diff line number Diff line change 11#include " NoteLog_Arduino.hpp"
22
3+ // Singleton instance of the NoteLog_Arduino class
4+ namespace instance {
5+ inline NoteLog* & note_log (void ) {
6+ static NoteLog* note_log = nullptr ;
7+ return note_log;
8+ }
9+ };
10+
311NoteLog *
412make_note_log (
5- NoteLog::param_t log_parameters_
6- )
7- {
8- static NoteLog * note_log = nullptr ;
9- if (!log_parameters_) {
10- if (note_log) {
11- delete note_log;
12- note_log = nullptr ;
13- }
14- } else if (!note_log) {
15- note_log = new NoteLog_Arduino (reinterpret_cast <Stream *>(log_parameters_));
13+ nullptr_t
14+ ) {
15+ NoteLog* & note_log = instance::note_log ();
16+ if (note_log) {
17+ delete note_log;
18+ note_log = nullptr ;
19+ }
20+ return note_log;
21+ }
22+
23+ template <typename T>
24+ NoteLog *
25+ make_note_log (
26+ T & log_parameters_
27+ ) {
28+ NoteLog* & note_log = instance::note_log ();
29+ if (!note_log) {
30+ note_log = new NoteLog_Arduino (reinterpret_cast <T *>(&log_parameters_));
1631 }
32+
1733 return note_log;
1834}
1935
@@ -35,3 +51,6 @@ NoteLog_Arduino::print (
3551
3652 return result;
3753}
54+
55+ // Explicitly instantiate the template function for the supported types
56+ template NoteLog * make_note_log<Stream>(Stream &);
Original file line number Diff line number Diff line change @@ -67,7 +67,7 @@ class Notecard
6767 begin (make_note_serial (&arduino_parameters));
6868 }
6969 inline void setDebugOutputStream (Stream &dbgserial) {
70- setDebugOutputStream (make_note_log (& dbgserial));
70+ setDebugOutputStream (make_note_log (dbgserial));
7171 }
7272 inline void setTransactionPins (uint8_t ctx_pin, uint8_t rtx_pin) {
7373 uint8_t txn_pins[2 ] = {ctx_pin, rtx_pin};
Original file line number Diff line number Diff line change @@ -16,7 +16,7 @@ int test_make_note_log_instantiates_notelog_object()
1616 NoteLog * notelog = nullptr ;
1717
1818 // Action
19- notelog = make_note_log (reinterpret_cast <NoteLog:: param_t >(&Serial));
19+ notelog = make_note_log (* reinterpret_cast <Stream * >(&Serial));
2020
2121 // Assert
2222 if (nullptr != notelog)
@@ -42,10 +42,10 @@ int test_make_note_log_enforces_singleton_by_returning_same_notelog_object_for_a
4242 int result;
4343
4444 // Arrange
45- NoteLog * const notelog_1 = make_note_log (reinterpret_cast <NoteLog:: param_t >(&Serial));
45+ NoteLog * const notelog_1 = make_note_log (* reinterpret_cast <Stream * >(&Serial));
4646
4747 // Action
48- NoteLog * const notelog_2 = make_note_log (reinterpret_cast <NoteLog:: param_t >(&Serial));
48+ NoteLog * const notelog_2 = make_note_log (* reinterpret_cast <Stream * >(&Serial));
4949
5050 // Assert
5151 if (notelog_1 == notelog_2)
@@ -72,7 +72,7 @@ int test_make_note_log_deletes_singleton_when_nullptr_is_passed_as_parameter()
7272 int result;
7373
7474 // Arrange
75- NoteLog * notelog = make_note_log (reinterpret_cast <NoteLog:: param_t >(&Serial));
75+ NoteLog * notelog = make_note_log (* reinterpret_cast <Stream * >(&Serial));
7676 assert (notelog);
7777
7878 // Action
Original file line number Diff line number Diff line change 11#include " mock/NoteLog_Mock.hpp"
22
3- MakeNoteLog_Parameters make_note_log_Parameters;
3+ MakeNoteLog_Parameters<HardwareSerial> make_note_log_Parameters;
44NoteLogPrint_Parameters noteLogPrint_Parameters;
55
66NoteLog *
77make_note_log (
8- NoteLog::param_t log_parameters_
8+ nullptr_t
9+ ) {
10+ // Record invocation(s)
11+ ++make_note_log_Parameters.invoked ;
12+
13+ // Stash parameter(s)
14+ make_note_log_Parameters.log_parameters = nullptr ;
15+
16+ // Return user-supplied result
17+ return make_note_log_Parameters.result ;
18+ }
19+
20+ template <typename T>
21+ NoteLog *
22+ make_note_log (
23+ T & log_parameters_
924)
1025{
1126 // Record invocation(s)
Original file line number Diff line number Diff line change 55#include < stdint.h>
66
77#include " NoteLog.hpp"
8+ #include " mock-arduino.hpp"
89
910class NoteLog_Mock final : public NoteLog
1011{
1112public:
1213 size_t print (const char * message) override ;
1314};
1415
16+ template <typename T>
1517struct MakeNoteLog_Parameters {
1618 MakeNoteLog_Parameters (
1719 void
@@ -28,7 +30,7 @@ struct MakeNoteLog_Parameters {
2830 result = nullptr ;
2931 }
3032 size_t invoked;
31- NoteLog:: param_t log_parameters;
33+ T * log_parameters;
3234 NoteLog * result;
3335};
3436
@@ -52,7 +54,7 @@ struct NoteLogPrint_Parameters {
5254 size_t result;
5355};
5456
55- extern MakeNoteLog_Parameters make_note_log_Parameters;
57+ extern MakeNoteLog_Parameters<HardwareSerial> make_note_log_Parameters;
5658extern NoteLogPrint_Parameters noteLogPrint_Parameters;
5759
5860#endif // MOCK_NOTE_LOG_HPP
You can’t perform that action at this time.
0 commit comments