Skip to content

Commit 8bc30d0

Browse files
committed
Template NoteLog Singleton function
1 parent 3ab14c2 commit 8bc30d0

File tree

6 files changed

+58
-29
lines changed

6 files changed

+58
-29
lines changed

src/NoteLog.hpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@
66
class NoteLog
77
{
88
public:
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

src/NoteLog_Arduino.cpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,35 @@
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+
311
NoteLog *
412
make_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 &);

src/Notecard.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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};

test/NoteLog_Arduino.test.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff 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

test/mock/NoteLog_Mock.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
#include "mock/NoteLog_Mock.hpp"
22

3-
MakeNoteLog_Parameters make_note_log_Parameters;
3+
MakeNoteLog_Parameters<HardwareSerial> make_note_log_Parameters;
44
NoteLogPrint_Parameters noteLogPrint_Parameters;
55

66
NoteLog *
77
make_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)

test/mock/NoteLog_Mock.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
#include <stdint.h>
66

77
#include "NoteLog.hpp"
8+
#include "mock-arduino.hpp"
89

910
class NoteLog_Mock final : public NoteLog
1011
{
1112
public:
1213
size_t print(const char * message) override;
1314
};
1415

16+
template <typename T>
1517
struct 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;
5658
extern NoteLogPrint_Parameters noteLogPrint_Parameters;
5759

5860
#endif // MOCK_NOTE_LOG_HPP

0 commit comments

Comments
 (0)