GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/sot/flags.cpp Lines: 47 81 58.0 %
Date: 2023-03-13 12:09:37 Branches: 32 80 40.0 %

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
4
  if (outOfRangeFlag) return true;
56
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
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
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
3
  res |= f2;
100
3
  return res;
101
}
102
103
7
Flags &Flags::operator&=(const Flags &f2) {
104
7
  if (f2.flags.size() > flags.size())
105
    flags.resize(f2.flags.size(), outOfRangeFlag);
106
7
  for (unsigned int i = 0; i < f2.flags.size(); ++i)
107
    flags[i] = flags[i] & f2.flags[i];
108
7
  for (auto i = f2.flags.size(); i < flags.size(); ++i)
109
    flags[i] = flags[i] & f2.outOfRangeFlag;
110

7
  outOfRangeFlag = outOfRangeFlag && f2.outOfRangeFlag;
111
7
  return *this;
112
}
113
114
3
Flags &Flags::operator|=(const Flags &f2) {
115
3
  if (f2.flags.size() > flags.size())
116
    flags.resize(f2.flags.size(), outOfRangeFlag);
117
3
  for (unsigned int i = 0; i < f2.flags.size(); ++i)
118
    flags[i] = flags[i] | f2.flags[i];
119
3
  for (auto i = f2.flags.size(); i < flags.size(); ++i)
120
    flags[i] = flags[i] | f2.outOfRangeFlag;
121

3
  outOfRangeFlag = outOfRangeFlag || f2.outOfRangeFlag;
122
3
  return *this;
123
}
124
125
/* --------------------------------------------------------------------- */
126
14
std::ostream &operator<<(std::ostream &os, const Flags &fl) {
127

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

6
  while (is.get(c).good()) {
135

5
    switch (c) {
136
3
      case '0':
137
3
        fl.flags.push_back(false);
138
3
        break;
139
2
      case '1':
140
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 */