Coverage Report

Created: 2026-01-09 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opendnp3/cpp/lib/src/app/Serializer.h
Line
Count
Source
1
/*
2
 * Copyright 2013-2022 Step Function I/O, LLC
3
 *
4
 * Licensed to Green Energy Corp (www.greenenergycorp.com) and Step Function I/O
5
 * LLC (https://stepfunc.io) under one or more contributor license agreements.
6
 * See the NOTICE file distributed with this work for additional information
7
 * regarding copyright ownership. Green Energy Corp and Step Function I/O LLC license
8
 * this file to you under the Apache License, Version 2.0 (the "License"); you
9
 * may not use this file except in compliance with the License. You may obtain
10
 * a copy of the License at:
11
 *
12
 * http://www.apache.org/licenses/LICENSE-2.0
13
 *
14
 * Unless required by applicable law or agreed to in writing, software
15
 * distributed under the License is distributed on an "AS IS" BASIS,
16
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
 * See the License for the specific language governing permissions and
18
 * limitations under the License.
19
 */
20
#ifndef OPENDNP3_SERIALIZER_H
21
#define OPENDNP3_SERIALIZER_H
22
23
#include <ser4cpp/container/SequenceTypes.h>
24
25
namespace opendnp3
26
{
27
28
template<class T> class Serializer
29
{
30
public:
31
    using read_func_t = bool (*)(ser4cpp::rseq_t& buffer, T& output);
32
    using write_func_t = bool (*)(const T& value, ser4cpp::wseq_t& buffer);
33
34
0
    Serializer() = default;
Unexecuted instantiation: opendnp3::Serializer<opendnp3::ControlRelayOutputBlock>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::AnalogOutputInt16>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::AnalogOutputInt32>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::AnalogOutputFloat32>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::AnalogOutputDouble64>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::Binary>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::DoubleBitBinary>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::Analog>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::Counter>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::FrozenCounter>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::BinaryOutputStatus>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::AnalogOutputStatus>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::TimeAndInterval>::Serializer()
Unexecuted instantiation: opendnp3::Serializer<opendnp3::OctetString>::Serializer()
35
36
    Serializer(size_t size, read_func_t read_func, write_func_t write_func)
37
15.4k
        : size(size), read_func(read_func), write_func(write_func)
38
15.4k
    {
39
15.4k
    }
opendnp3::Serializer<opendnp3::ControlRelayOutputBlock>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::ControlRelayOutputBlock&), bool (*)(opendnp3::ControlRelayOutputBlock const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.58k
        : size(size), read_func(read_func), write_func(write_func)
38
1.58k
    {
39
1.58k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt16>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::AnalogOutputInt16&), bool (*)(opendnp3::AnalogOutputInt16 const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
2.55k
        : size(size), read_func(read_func), write_func(write_func)
38
2.55k
    {
39
2.55k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt32>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::AnalogOutputInt32&), bool (*)(opendnp3::AnalogOutputInt32 const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.68k
        : size(size), read_func(read_func), write_func(write_func)
38
1.68k
    {
39
1.68k
    }
opendnp3::Serializer<opendnp3::AnalogOutputFloat32>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::AnalogOutputFloat32&), bool (*)(opendnp3::AnalogOutputFloat32 const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.95k
        : size(size), read_func(read_func), write_func(write_func)
38
1.95k
    {
39
1.95k
    }
opendnp3::Serializer<opendnp3::AnalogOutputDouble64>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::AnalogOutputDouble64&), bool (*)(opendnp3::AnalogOutputDouble64 const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.88k
        : size(size), read_func(read_func), write_func(write_func)
38
1.88k
    {
39
1.88k
    }
opendnp3::Serializer<opendnp3::Binary>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::Binary&), bool (*)(opendnp3::Binary const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
600
        : size(size), read_func(read_func), write_func(write_func)
38
600
    {
39
600
    }
opendnp3::Serializer<opendnp3::DoubleBitBinary>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::DoubleBitBinary&), bool (*)(opendnp3::DoubleBitBinary const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
503
        : size(size), read_func(read_func), write_func(write_func)
38
503
    {
39
503
    }
opendnp3::Serializer<opendnp3::Analog>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::Analog&), bool (*)(opendnp3::Analog const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.04k
        : size(size), read_func(read_func), write_func(write_func)
38
1.04k
    {
39
1.04k
    }
opendnp3::Serializer<opendnp3::Counter>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::Counter&), bool (*)(opendnp3::Counter const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
718
        : size(size), read_func(read_func), write_func(write_func)
38
718
    {
39
718
    }
opendnp3::Serializer<opendnp3::FrozenCounter>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::FrozenCounter&), bool (*)(opendnp3::FrozenCounter const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
1.04k
        : size(size), read_func(read_func), write_func(write_func)
38
1.04k
    {
39
1.04k
    }
opendnp3::Serializer<opendnp3::BinaryOutputStatus>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::BinaryOutputStatus&), bool (*)(opendnp3::BinaryOutputStatus const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
502
        : size(size), read_func(read_func), write_func(write_func)
38
502
    {
39
502
    }
opendnp3::Serializer<opendnp3::AnalogOutputStatus>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::AnalogOutputStatus&), bool (*)(opendnp3::AnalogOutputStatus const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
763
        : size(size), read_func(read_func), write_func(write_func)
38
763
    {
39
763
    }
opendnp3::Serializer<opendnp3::TimeAndInterval>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::TimeAndInterval&), bool (*)(opendnp3::TimeAndInterval const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
323
        : size(size), read_func(read_func), write_func(write_func)
38
323
    {
39
323
    }
opendnp3::Serializer<opendnp3::OctetString>::Serializer(unsigned long, bool (*)(ser4cpp::RSeq<unsigned long>&, opendnp3::OctetString&), bool (*)(opendnp3::OctetString const&, ser4cpp::WSeq<unsigned long>&))
Line
Count
Source
37
330
        : size(size), read_func(read_func), write_func(write_func)
38
330
    {
39
330
    }
40
41
    /**
42
     * @return The size (in bytes) required for every call to read/write
43
     */
44
    size_t get_size() const
45
47.4k
    {
46
47.4k
        return size;
47
47.4k
    }
opendnp3::Serializer<opendnp3::ControlRelayOutputBlock>::get_size() const
Line
Count
Source
45
2.05k
    {
46
2.05k
        return size;
47
2.05k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt16>::get_size() const
Line
Count
Source
45
3.31k
    {
46
3.31k
        return size;
47
3.31k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt32>::get_size() const
Line
Count
Source
45
2.29k
    {
46
2.29k
        return size;
47
2.29k
    }
opendnp3::Serializer<opendnp3::AnalogOutputFloat32>::get_size() const
Line
Count
Source
45
2.64k
    {
46
2.64k
        return size;
47
2.64k
    }
opendnp3::Serializer<opendnp3::AnalogOutputDouble64>::get_size() const
Line
Count
Source
45
2.18k
    {
46
2.18k
        return size;
47
2.18k
    }
opendnp3::Serializer<opendnp3::Binary>::get_size() const
Line
Count
Source
45
3.83k
    {
46
3.83k
        return size;
47
3.83k
    }
opendnp3::Serializer<opendnp3::DoubleBitBinary>::get_size() const
Line
Count
Source
45
2.99k
    {
46
2.99k
        return size;
47
2.99k
    }
opendnp3::Serializer<opendnp3::Analog>::get_size() const
Line
Count
Source
45
5.82k
    {
46
5.82k
        return size;
47
5.82k
    }
opendnp3::Serializer<opendnp3::Counter>::get_size() const
Line
Count
Source
45
4.16k
    {
46
4.16k
        return size;
47
4.16k
    }
opendnp3::Serializer<opendnp3::FrozenCounter>::get_size() const
Line
Count
Source
45
5.92k
    {
46
5.92k
        return size;
47
5.92k
    }
opendnp3::Serializer<opendnp3::BinaryOutputStatus>::get_size() const
Line
Count
Source
45
3.08k
    {
46
3.08k
        return size;
47
3.08k
    }
opendnp3::Serializer<opendnp3::AnalogOutputStatus>::get_size() const
Line
Count
Source
45
4.62k
    {
46
4.62k
        return size;
47
4.62k
    }
opendnp3::Serializer<opendnp3::TimeAndInterval>::get_size() const
Line
Count
Source
45
2.18k
    {
46
2.18k
        return size;
47
2.18k
    }
opendnp3::Serializer<opendnp3::OctetString>::get_size() const
Line
Count
Source
45
2.31k
    {
46
2.31k
        return size;
47
2.31k
    }
48
49
    /**
50
     * reads the value and advances the read buffer
51
     */
52
    bool read(ser4cpp::rseq_t& buffer, T& output) const
53
    {
54
        return (*read_func)(buffer, output);
55
    }
56
57
    /**
58
     * writes the value and advances the write buffer
59
     */
60
    bool write(const T& value, ser4cpp::wseq_t& buffer) const
61
65.3k
    {
62
65.3k
        return (*write_func)(value, buffer);
63
65.3k
    }
opendnp3::Serializer<opendnp3::ControlRelayOutputBlock>::write(opendnp3::ControlRelayOutputBlock const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
3.57k
    {
62
3.57k
        return (*write_func)(value, buffer);
63
3.57k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt16>::write(opendnp3::AnalogOutputInt16 const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
14.0k
    {
62
14.0k
        return (*write_func)(value, buffer);
63
14.0k
    }
opendnp3::Serializer<opendnp3::AnalogOutputInt32>::write(opendnp3::AnalogOutputInt32 const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
6.14k
    {
62
6.14k
        return (*write_func)(value, buffer);
63
6.14k
    }
opendnp3::Serializer<opendnp3::AnalogOutputFloat32>::write(opendnp3::AnalogOutputFloat32 const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
5.89k
    {
62
5.89k
        return (*write_func)(value, buffer);
63
5.89k
    }
opendnp3::Serializer<opendnp3::AnalogOutputDouble64>::write(opendnp3::AnalogOutputDouble64 const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
6.57k
    {
62
6.57k
        return (*write_func)(value, buffer);
63
6.57k
    }
opendnp3::Serializer<opendnp3::Binary>::write(opendnp3::Binary const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
3.23k
    {
62
3.23k
        return (*write_func)(value, buffer);
63
3.23k
    }
opendnp3::Serializer<opendnp3::DoubleBitBinary>::write(opendnp3::DoubleBitBinary const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
2.49k
    {
62
2.49k
        return (*write_func)(value, buffer);
63
2.49k
    }
opendnp3::Serializer<opendnp3::Analog>::write(opendnp3::Analog const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
4.78k
    {
62
4.78k
        return (*write_func)(value, buffer);
63
4.78k
    }
opendnp3::Serializer<opendnp3::Counter>::write(opendnp3::Counter const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
3.44k
    {
62
3.44k
        return (*write_func)(value, buffer);
63
3.44k
    }
opendnp3::Serializer<opendnp3::FrozenCounter>::write(opendnp3::FrozenCounter const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
4.88k
    {
62
4.88k
        return (*write_func)(value, buffer);
63
4.88k
    }
opendnp3::Serializer<opendnp3::BinaryOutputStatus>::write(opendnp3::BinaryOutputStatus const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
2.58k
    {
62
2.58k
        return (*write_func)(value, buffer);
63
2.58k
    }
opendnp3::Serializer<opendnp3::AnalogOutputStatus>::write(opendnp3::AnalogOutputStatus const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
3.86k
    {
62
3.86k
        return (*write_func)(value, buffer);
63
3.86k
    }
opendnp3::Serializer<opendnp3::TimeAndInterval>::write(opendnp3::TimeAndInterval const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
1.86k
    {
62
1.86k
        return (*write_func)(value, buffer);
63
1.86k
    }
opendnp3::Serializer<opendnp3::OctetString>::write(opendnp3::OctetString const&, ser4cpp::WSeq<unsigned long>&) const
Line
Count
Source
61
1.98k
    {
62
1.98k
        return (*write_func)(value, buffer);
63
1.98k
    }
64
65
private:
66
    size_t size = 0;
67
    read_func_t read_func = nullptr;
68
    write_func_t write_func = nullptr;
69
};
70
} // namespace opendnp3
71
72
#endif