| 1 | // **************************************************************************
|
|---|
| 2 | /** @struct State
|
|---|
| 3 |
|
|---|
| 4 | @brief A struct which stores an index, a comment and a name of a State
|
|---|
| 5 |
|
|---|
| 6 | To have proper descriptions of states in the network, this struct provides
|
|---|
| 7 | a simple storage for the properties of a state.
|
|---|
| 8 |
|
|---|
| 9 | Assume you want to write a descriptive string for a state machine
|
|---|
| 10 | with two states, it could look like this:
|
|---|
| 11 |
|
|---|
| 12 | "1:Disconnected=Connection not established\n2:Connected=Connection established."
|
|---|
| 13 |
|
|---|
| 14 | Such a string can then be converted with SplitStates into a vector
|
|---|
| 15 | of State objects.
|
|---|
| 16 |
|
|---|
| 17 | */
|
|---|
| 18 | // **************************************************************************
|
|---|
| 19 | #include "State.h"
|
|---|
| 20 |
|
|---|
| 21 | #include <sstream>
|
|---|
| 22 | #include <algorithm>
|
|---|
| 23 |
|
|---|
| 24 | #include "tools.h"
|
|---|
| 25 |
|
|---|
| 26 | using namespace std;
|
|---|
| 27 | using namespace Tools;
|
|---|
| 28 |
|
|---|
| 29 | // --------------------------------------------------------------------------
|
|---|
| 30 | //
|
|---|
| 31 | //! Construct a Description object
|
|---|
| 32 | //!
|
|---|
| 33 | //! @param i
|
|---|
| 34 | //! Index of the state, e.g. 1
|
|---|
| 35 | //!
|
|---|
| 36 | //! @param n
|
|---|
| 37 | //! Name of the state, e.g. 'Connected'
|
|---|
| 38 | //!
|
|---|
| 39 | //! @param c
|
|---|
| 40 | //! Descriptive text of the state, e.g. "Connection to hardware established."
|
|---|
| 41 | //
|
|---|
| 42 | State::State(int i, const std::string &n, const std::string &c)
|
|---|
| 43 | : index(i), name(Trim(n)), comment(Trim(c))
|
|---|
| 44 | {
|
|---|
| 45 | }
|
|---|
| 46 |
|
|---|
| 47 | // --------------------------------------------------------------------------
|
|---|
| 48 | //
|
|---|
| 49 | //! This function breaks down a descriptive string into its components.
|
|---|
| 50 | //! For details see class reference.
|
|---|
| 51 | //!
|
|---|
| 52 | //! @param buffer
|
|---|
| 53 | //! string which should be broekn into pieces
|
|---|
| 54 | //!
|
|---|
| 55 | //! @returns
|
|---|
| 56 | //! A vector<State> containing all the states found.
|
|---|
| 57 | //
|
|---|
| 58 | vector<State> State::SplitStates(const string &buffer)
|
|---|
| 59 | {
|
|---|
| 60 | vector<State> vec;
|
|---|
| 61 |
|
|---|
| 62 | string buf;
|
|---|
| 63 | stringstream stream(buffer);
|
|---|
| 64 | while (getline(stream, buf, '\n'))
|
|---|
| 65 | {
|
|---|
| 66 | if (buf.empty())
|
|---|
| 67 | continue;
|
|---|
| 68 |
|
|---|
| 69 | const size_t p1 = buf.find_first_of(':');
|
|---|
| 70 | const size_t p2 = buf.find_first_of('=');
|
|---|
| 71 |
|
|---|
| 72 | stringstream s(buf.substr(0, p1));
|
|---|
| 73 |
|
|---|
| 74 | int index;
|
|---|
| 75 | s >> index;
|
|---|
| 76 |
|
|---|
| 77 | const string name = buf.substr(p1+1, p2-p1-1);
|
|---|
| 78 | const string comment = p2==string::npos ? "" : buf.substr(p2+1);
|
|---|
| 79 |
|
|---|
| 80 | vec.push_back(State(index, name, comment));
|
|---|
| 81 | }
|
|---|
| 82 |
|
|---|
| 83 | sort(vec.begin(), vec.end(), State::Compare);
|
|---|
| 84 |
|
|---|
| 85 | return vec;
|
|---|
| 86 | }
|
|---|