| Directory: | ./ |
|---|---|
| File: | src/sot/flags.cpp |
| Date: | 2025-05-13 12:28:21 |
| 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 |