GCC Code Coverage Report


Directory: src/gate/
File: src/gate/cxx_delegates.cpp
Date: 2026-03-20 22:56:14
Exec Total Coverage
Lines: 32 41 78.0%
Functions: 11 14 78.6%
Branches: 5 8 62.5%

Line Branch Exec Source
1 /* GATE PROJECT LICENSE:
2 +----------------------------------------------------------------------------+
3 | Copyright (c) 2018-2026, Stefan Meislinger <sm@opengate.at> |
4 | All rights reserved. |
5 | |
6 | Redistribution and use in source and binary forms, with or without |
7 | modification, are permitted provided that the following conditions are met:|
8 | |
9 | 1. Redistributions of source code must retain the above copyright notice, |
10 | this list of conditions and the following disclaimer. |
11 | 2. Redistributions in binary form must reproduce the above copyright |
12 | notice, this list of conditions and the following disclaimer in the |
13 | documentation and/or other materials provided with the distribution. |
14 | |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"|
16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
19 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
25 | THE POSSIBILITY OF SUCH DAMAGE. |
26 +----------------------------------------------------------------------------+
27 */
28
29 #include "gate/delegates.hpp"
30 #include "gate/exceptions.hpp"
31
32 namespace gate
33 {
34
35 1 Delegate::Delegate()
36 {
37 1 Mem::clear(&this->impl, sizeof(this->impl));
38 1 }
39
40 132 Delegate::Delegate(gate_delegate_dispatcher_t dispatcher, void* obj_ptr, void* function_ptr, size_t function_ptr_size)
41 {
42 132 Mem::clear(&this->impl, sizeof(this->impl));
43 132 this->impl.dispatcher = dispatcher;
44 132 this->impl.object_ptr = obj_ptr;
45 132 Mem::copy(&this->impl.function_storage, function_ptr, function_ptr_size);
46 132 }
47
48 162 Delegate::~Delegate()
49 {
50 162 }
51
52 result_t Delegate::handle_exception()
53 {
54 exception_info_t xcpt = catchCurrentException();
55 return xcpt.result_code;
56 }
57
58 171 void Delegate::translate_result(result_t result) const
59 {
60
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 164 times.
171 GATEXX_CHECK_ERROR(result);
61 164 }
62
63 27 delegate_t const* Delegate::c_impl() const
64 {
65 27 return &this->impl;
66 }
67
68 3 bool Delegate::operator!() const
69 {
70 3 char buffer[sizeof(this->impl)] = GATE_INIT_EMPTY;
71 3 return Mem::compare(&this->impl, buffer, sizeof(this->impl)) == 0;
72 }
73 2 bool Delegate::operator==(Delegate const& src) const
74 {
75 2 return Mem::compare(&this->impl, &src.impl, sizeof(this->impl)) == 0;
76 }
77 1 bool Delegate::operator!=(Delegate const& src) const
78 {
79 1 return Mem::compare(&this->impl, &src.impl, sizeof(this->impl)) != 0;
80 }
81
82
83
84 1 void MulticastDelegate0::invoke() const
85 {
86
2/2
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 for (list_t::const_iterator it(this->impl.begin()), itend(this->impl.end()); it != itend; ++it)
87 {
88 #if defined(GATEXX_NO_EXCEPTIONS)
89 it->invoke();
90 #else
91
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 try { it->invoke(); }
92 catch (...) {}
93 #endif
94 }
95 1 }
96 1 void MulticastDelegate0::operator()() const
97 {
98 1 this->invoke();
99 1 }
100
101 void MulticastDelegate0::clear()
102 {
103 clearSlots(this->impl);
104 }
105
106 1 MulticastDelegate0::self_t& MulticastDelegate0::operator+=(delegator_t const& del)
107 {
108 1 addSlot(this->impl, del); return *this;
109 }
110
111 MulticastDelegate0::self_t& MulticastDelegate0::operator-=(delegator_t const& del)
112 {
113 removeSlot(this->impl, del); return *this;
114 }
115
116 } // end of namespace gate
117
118