Skip to content

Commit 61b6e07

Browse files
author
Karl Herbig
committed
make pointer to Private NetLayer implementation a unique_ptr, also make modbus_t a unique_ptr
1 parent 36503f6 commit 61b6e07

File tree

12 files changed

+44
-44
lines changed

12 files changed

+44
-44
lines changed

include/modbuspp/asciilayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ namespace Modbus {
196196

197197
protected:
198198
class Private;
199-
AsciiLayer (Private &dd);
199+
AsciiLayer (std::unique_ptr<Private> &&dd);
200200

201201
private:
202202
PIMP_DECLARE_PRIVATE (AsciiLayer)

include/modbuspp/netlayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ namespace Modbus {
118118

119119
protected:
120120
class Private;
121-
NetLayer (Private &dd);
122-
std::unique_ptr<Private> d_ptr;
121+
NetLayer (std::unique_ptr<NetLayer::Private> &&dd);
122+
std::unique_ptr<NetLayer::Private> d_ptr;
123123

124124
private:
125125
PIMP_DECLARE_PRIVATE (NetLayer)

include/modbuspp/rtulayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ namespace Modbus {
196196

197197
protected:
198198
class Private;
199-
RtuLayer (Private &dd);
199+
RtuLayer (std::unique_ptr<RtuLayer::Private> &&dd);
200200

201201
private:
202202
PIMP_DECLARE_PRIVATE (RtuLayer)

include/modbuspp/tcplayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ namespace Modbus {
7878

7979
protected:
8080
class Private;
81-
TcpLayer (Private &dd);
81+
TcpLayer (std::unique_ptr<TcpLayer::Private> &&dd);
8282

8383
private:
8484
PIMP_DECLARE_PRIVATE (TcpLayer)

src/asciilayer.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ namespace Modbus {
3232
// ---------------------------------------------------------------------------
3333

3434
// ---------------------------------------------------------------------------
35-
AsciiLayer::AsciiLayer (AsciiLayer::Private &dd) : NetLayer (dd) {}
35+
AsciiLayer::AsciiLayer (std::unique_ptr<AsciiLayer::Private> &&dd) : NetLayer (std::move(dd)) {}
3636

3737
// ---------------------------------------------------------------------------
3838
AsciiLayer::AsciiLayer (const std::string & port, const std::string & settings) :
39-
NetLayer (*new Private (port, settings)) {}
39+
NetLayer (std::unique_ptr<AsciiLayer::Private>(new AsciiLayer::Private (port, settings))) {}
4040

4141
// ---------------------------------------------------------------------------
4242
SerialMode AsciiLayer::serialMode() {
4343
PIMP_D (AsciiLayer);
4444

45-
int m = modbus_serial_get_serial_mode (d->ctx);
45+
int m = modbus_serial_get_serial_mode (d->ctx.get());
4646
if (m != -1) {
4747
return static_cast<SerialMode> (m);
4848
}
@@ -53,14 +53,14 @@ namespace Modbus {
5353
bool AsciiLayer::setSerialMode (SerialMode mode) {
5454
PIMP_D (AsciiLayer);
5555

56-
return (modbus_serial_set_serial_mode (d->ctx, static_cast<int> (mode)) != -1);
56+
return (modbus_serial_set_serial_mode (d->ctx.get(), static_cast<int> (mode)) != -1);
5757
}
5858

5959
// ---------------------------------------------------------------------------
6060
SerialRts AsciiLayer::rts() {
6161
PIMP_D (AsciiLayer);
6262

63-
int r = modbus_serial_get_rts (d->ctx);
63+
int r = modbus_serial_get_rts (d->ctx.get());
6464
if (r != -1) {
6565

6666
return static_cast<SerialRts> (r);
@@ -72,21 +72,21 @@ namespace Modbus {
7272
bool AsciiLayer::setRts (SerialRts r) {
7373
PIMP_D (AsciiLayer);
7474

75-
return (modbus_serial_set_rts (d->ctx, static_cast<int> (r)) != -1);
75+
return (modbus_serial_set_rts (d->ctx.get(), static_cast<int> (r)) != -1);
7676
}
7777

7878
// ---------------------------------------------------------------------------
7979
int AsciiLayer::rtsDelay() {
8080
PIMP_D (AsciiLayer);
8181

82-
return modbus_serial_get_rts_delay (d->ctx);
82+
return modbus_serial_get_rts_delay (d->ctx.get());
8383
}
8484

8585
// ---------------------------------------------------------------------------
8686
bool AsciiLayer::setRtsDelay (int delay) {
8787
PIMP_D (AsciiLayer);
8888

89-
return (modbus_serial_set_rts_delay (d->ctx, delay) != -1);
89+
return (modbus_serial_set_rts_delay (d->ctx.get(), delay) != -1);
9090
}
9191

9292
// ---------------------------------------------------------------------------
@@ -131,7 +131,7 @@ namespace Modbus {
131131
setRts (r);
132132
usleep (rtsDelay());
133133

134-
size = write (modbus_get_socket (d->ctx), msg->adu(), msg->aduSize());
134+
size = write (modbus_get_socket (d->ctx.get()), msg->adu(), msg->aduSize());
135135

136136
usleep (d->oneByteTime * msg->aduSize() + rtsDelay());
137137
setRts ( (r == RtsDown) ? RtsUp : RtsDown); // restore initial state
@@ -140,7 +140,7 @@ namespace Modbus {
140140
}
141141
else {
142142
#endif
143-
return write (modbus_get_socket (d->ctx), msg->adu(), msg->aduSize());
143+
return write (modbus_get_socket (d->ctx.get()), msg->adu(), msg->aduSize());
144144
#if MODBUSPP_HAVE_TIOCM_RTS
145145
}
146146
#endif
@@ -265,17 +265,17 @@ static char nibble_to_hex_ascii(uint8_t nibble)
265265
NetLayer::Private (Ascii, port, settings, MODBUS_ASCII_MAX_ADU_LENGTH) {
266266

267267
// RTU MUST BE 8-bits
268-
ctx = modbus_new_ascii (port.c_str(), AsciiLayer::baud (settings),
268+
ctx.reset( modbus_new_ascii (port.c_str(), AsciiLayer::baud (settings),
269269
AsciiLayer::parity (settings), 8,
270-
AsciiLayer::stop (settings));
270+
AsciiLayer::stop (settings)) );
271271

272272
if (! ctx) {
273273

274274
throw std::invalid_argument (
275275
"Unable to create ASCII Modbus Backend("
276276
+ port + "," + settings + ")\n" + lastError());
277277
}
278-
oneByteTime = modbus_serial_get_rts_delay (ctx);
278+
oneByteTime = modbus_serial_get_rts_delay (ctx.get());
279279
}
280280
}
281281

src/asciilayer_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace Modbus {
2525

2626
public:
2727
Private (const std::string & port, const std::string & settings);
28+
2829
int oneByteTime;
2930
};
3031
}

src/netlayer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace Modbus {
2626
// ---------------------------------------------------------------------------
2727

2828
// ---------------------------------------------------------------------------
29-
NetLayer::NetLayer (NetLayer::Private &dd) : d_ptr (&dd) {}
29+
NetLayer::NetLayer (std::unique_ptr<NetLayer::Private> &&dd) : d_ptr (std::move(dd)) {}
3030

3131
// ---------------------------------------------------------------------------
3232
NetLayer::NetLayer () :
@@ -53,14 +53,14 @@ namespace Modbus {
5353
modbus_t * NetLayer::context() {
5454
PIMP_D (NetLayer);
5555

56-
return d->ctx;
56+
return d->ctx.get();
5757
}
5858

5959
// ---------------------------------------------------------------------------
6060
const modbus_t * NetLayer::context() const {
6161
PIMP_D (const NetLayer);
6262

63-
return d->ctx;
63+
return d->ctx.get();
6464
}
6565

6666
// ---------------------------------------------------------------------------

src/netlayer_p.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,14 @@ namespace Modbus {
2323
class NetLayer::Private {
2424
public:
2525
Private (Net n, const std::string & c, const std::string & s, uint16_t m) :
26-
ctx (0), net (n), connection (c), settings (s), maxAduLength (m) {}
27-
virtual ~Private() {
28-
modbus_free (ctx);
29-
}
26+
net (n), connection (c), settings (s), maxAduLength (m) {}
3027

31-
modbus_t * ctx;
3228
Net net;
3329
std::string connection;
3430
std::string settings;
3531
uint16_t maxAduLength;
32+
std::unique_ptr<modbus_t, void(*)(modbus_t*)> ctx =
33+
{nullptr, [](modbus_t* p){ modbus_free(p); }};
3634
};
3735
}
3836

src/rtulayer.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,17 @@ namespace Modbus {
9494
// ---------------------------------------------------------------------------
9595

9696
// ---------------------------------------------------------------------------
97-
RtuLayer::RtuLayer (RtuLayer::Private &dd) : NetLayer (dd) {}
97+
RtuLayer::RtuLayer (std::unique_ptr<RtuLayer::Private> &&dd) : NetLayer (std::move(dd)) {}
9898

9999
// ---------------------------------------------------------------------------
100100
RtuLayer::RtuLayer (const std::string & port, const std::string & settings) :
101-
NetLayer (*new Private (port, settings)) {}
101+
NetLayer (std::unique_ptr<Private>(new Private(port, settings))) {}
102102

103103
// ---------------------------------------------------------------------------
104104
SerialMode RtuLayer::serialMode() {
105105
PIMP_D (RtuLayer);
106106

107-
int m = modbus_serial_get_serial_mode (d->ctx);
107+
int m = modbus_serial_get_serial_mode (d->ctx.get());
108108
if (m != -1) {
109109
return static_cast<SerialMode> (m);
110110
}
@@ -115,14 +115,14 @@ namespace Modbus {
115115
bool RtuLayer::setSerialMode (SerialMode mode) {
116116
PIMP_D (RtuLayer);
117117

118-
return (modbus_serial_set_serial_mode (d->ctx, static_cast<int> (mode)) != -1);
118+
return (modbus_serial_set_serial_mode (d->ctx.get(), static_cast<int> (mode)) != -1);
119119
}
120120

121121
// ---------------------------------------------------------------------------
122122
SerialRts RtuLayer::rts() {
123123
PIMP_D (RtuLayer);
124124

125-
int r = modbus_serial_get_rts (d->ctx);
125+
int r = modbus_serial_get_rts (d->ctx.get());
126126
if (r != -1) {
127127

128128
return static_cast<SerialRts> (r);
@@ -134,21 +134,21 @@ namespace Modbus {
134134
bool RtuLayer::setRts (SerialRts r) {
135135
PIMP_D (RtuLayer);
136136

137-
return (modbus_serial_set_rts (d->ctx, static_cast<int> (r)) != -1);
137+
return (modbus_serial_set_rts (d->ctx.get(), static_cast<int> (r)) != -1);
138138
}
139139

140140
// ---------------------------------------------------------------------------
141141
int RtuLayer::rtsDelay() {
142142
PIMP_D (RtuLayer);
143143

144-
return modbus_serial_get_rts_delay (d->ctx);
144+
return modbus_serial_get_rts_delay (d->ctx.get());
145145
}
146146

147147
// ---------------------------------------------------------------------------
148148
bool RtuLayer::setRtsDelay (int delay) {
149149
PIMP_D (RtuLayer);
150150

151-
return (modbus_serial_set_rts_delay (d->ctx, delay) != -1);
151+
return (modbus_serial_set_rts_delay (d->ctx.get(), delay) != -1);
152152
}
153153

154154
// ---------------------------------------------------------------------------
@@ -193,7 +193,7 @@ namespace Modbus {
193193
setRts (r);
194194
usleep (rtsDelay());
195195

196-
size = write (modbus_get_socket (d->ctx), msg->adu(), msg->aduSize());
196+
size = write (modbus_get_socket (d->ctx.get()), msg->adu(), msg->aduSize());
197197

198198
usleep (d->oneByteTime * msg->aduSize() + rtsDelay());
199199
setRts ( (r == RtsDown) ? RtsUp : RtsDown); // restore initial state
@@ -202,7 +202,7 @@ namespace Modbus {
202202
}
203203
else {
204204
#endif
205-
return write (modbus_get_socket (d->ctx), msg->adu(), msg->aduSize());
205+
return write (modbus_get_socket (d->ctx.get()), msg->adu(), msg->aduSize());
206206
#if MODBUSPP_HAVE_TIOCM_RTS
207207
}
208208
#endif
@@ -299,16 +299,15 @@ namespace Modbus {
299299
NetLayer::Private (Rtu, port, settings, MODBUS_RTU_MAX_ADU_LENGTH) {
300300

301301
// RTU MUST BE 8-bits
302-
ctx = modbus_new_rtu (port.c_str(), RtuLayer::baud (settings),
302+
ctx.reset( modbus_new_rtu (port.c_str(), RtuLayer::baud (settings),
303303
RtuLayer::parity (settings), 8,
304-
RtuLayer::stop (settings));
304+
RtuLayer::stop (settings)) );
305305
if (! ctx) {
306-
307306
throw std::invalid_argument (
308307
"Unable to create RTU Modbus Backend("
309308
+ port + "," + settings + ")\n" + lastError());
310309
}
311-
oneByteTime = modbus_serial_get_rts_delay (ctx);
310+
oneByteTime = modbus_serial_get_rts_delay (ctx.get());
312311
}
313312
}
314313

src/rtulayer_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace Modbus {
2525

2626
public:
2727
Private (const std::string & port, const std::string & settings);
28+
2829
int oneByteTime;
2930
};
3031
}

0 commit comments

Comments
 (0)