GCC Code Coverage Report


Directory: ./
File: src/sot/flags.cpp
Date: 2024-08-13 12:13:25
Exec Total Coverage
Lines: 47 81 58.0%
Branches: 32 96 33.3%

Line Branch Exec Source
1 /*
2 * Copyright 2010,
3 * François Bleibel,
4 * Olivier Stasse,
5 *
6 * CNRS/AIST
7 *
8 */
9
10 /* --------------------------------------------------------------------- */
11 /* --- INCLUDE --------------------------------------------------------- */
12 /* --------------------------------------------------------------------- */
13
14 /*! System framework */
15 #include <stdlib.h>
16
17 #include <list>
18
19 /*! Local Framework */
20 #include <sot/core/debug.hh>
21 #include <sot/core/flags.hh>
22
23 using namespace std;
24 using namespace dynamicgraph::sot;
25
26 /* --------------------------------------------------------------------- */
27 /* --- CLASS ----------------------------------------------------------- */
28 /* --------------------------------------------------------------------- */
29
30 74 Flags::Flags(const bool &b) : flags(), outOfRangeFlag(b) {}
31
32 Flags::Flags(const char *_flags)
33 : flags(strlen(_flags)), outOfRangeFlag(false) {
34 for (unsigned int i = 0; i < flags.size(); ++i) {
35 switch (_flags[i]) {
36 case '0':
37 flags[i] = false;
38 break;
39 case '1':
40 flags[i] = true;
41 break;
42 case ' ':
43 break;
44 default:
45 throw std::invalid_argument("Could not parse input string " +
46 std::string(_flags) + ". Expected 0 or 1.");
47 }
48 }
49 }
50
51 Flags::Flags(const std::vector<bool> &_flags)
52 : flags(_flags), outOfRangeFlag(false) {}
53
54 4 Flags::operator bool(void) const {
55
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 if (outOfRangeFlag) return true;
56
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 for (unsigned int i = 0; i < flags.size(); ++i)
57 if (flags[i]) return true;
58 1 return false;
59 }
60
61 /* --------------------------------------------------------------------- */
62
63 4800 bool Flags::operator()(const int &i) const {
64
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4800 times.
4800 if (i < (int)flags.size()) return flags[i];
65 4800 return outOfRangeFlag;
66 }
67
68 /* --------------------------------------------------------------------- */
69 void Flags::add(const bool &b) { flags.push_back(b); }
70
71 /* --------------------------------------------------------------------- */
72 void Flags::set(const unsigned int &idx) {
73 if (idx < flags.size()) flags[idx] = true;
74 }
75
76 void Flags::unset(const unsigned int &idx) {
77 if (idx < flags.size()) flags[idx] = false;
78 }
79
80 namespace dynamicgraph {
81 namespace sot {
82
83 /* --------------------------------------------------------------------- */
84 5 Flags Flags::operator!(void) const {
85 5 Flags res = *this;
86 5 res.flags.flip();
87 5 res.outOfRangeFlag = !outOfRangeFlag;
88 5 return res;
89 }
90
91 7 Flags operator&(const Flags &f1, const Flags &f2) {
92 7 Flags res = f1;
93
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 res &= f2;
94 7 return res;
95 }
96
97 3 Flags operator|(const Flags &f1, const Flags &f2) {
98 3 Flags res = f1;
99
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 res |= f2;
100 3 return res;
101 }
102
103 7 Flags &Flags::operator&=(const Flags &f2) {
104
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
7 if (f2.flags.size() > flags.size())
105 flags.resize(f2.flags.size(), outOfRangeFlag);
106
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 for (unsigned int i = 0; i < f2.flags.size(); ++i)
107 flags[i] = flags[i] & f2.flags[i];
108
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
7 for (auto i = f2.flags.size(); i < flags.size(); ++i)
109 flags[i] = flags[i] & f2.outOfRangeFlag;
110
4/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
7 outOfRangeFlag = outOfRangeFlag && f2.outOfRangeFlag;
111 7 return *this;
112 }
113
114 3 Flags &Flags::operator|=(const Flags &f2) {
115
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
3 if (f2.flags.size() > flags.size())
116 flags.resize(f2.flags.size(), outOfRangeFlag);
117
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 for (unsigned int i = 0; i < f2.flags.size(); ++i)
118 flags[i] = flags[i] | f2.flags[i];
119
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
3 for (auto i = f2.flags.size(); i < flags.size(); ++i)
120 flags[i] = flags[i] | f2.outOfRangeFlag;
121
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
3 outOfRangeFlag = outOfRangeFlag || f2.outOfRangeFlag;
122 3 return *this;
123 }
124
125 /* --------------------------------------------------------------------- */
126 14 std::ostream &operator<<(std::ostream &os, const Flags &fl) {
127
5/6
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 14 times.
19 for (auto f : fl.flags) os << (f ? '1' : '0');
128 14 return os;
129 }
130
131 1 std::istream &operator>>(std::istream &is, Flags &fl) {
132 char c;
133 1 fl.flags.clear();
134
4/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 1 times.
6 while (is.get(c).good()) {
135
2/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5 switch (c) {
136 3 case '0':
137
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 fl.flags.push_back(false);
138 3 break;
139 2 case '1':
140
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 fl.flags.push_back(true);
141 2 break;
142 case ' ':
143 break;
144 default:
145 throw std::invalid_argument("Could not parse input character " +
146 std::string(1, c) + ". Expected 0 or 1.");
147 }
148 }
149 1 return is;
150 }
151
152 } /* namespace sot */
153 } /* namespace dynamicgraph */
154