diff options
author | Tim Moore <timoore@redhat.com> | 2009-05-27 10:32:51 +0200 |
---|---|---|
committer | Tim Moore <timoore@redhat.com> | 2009-07-28 10:17:29 +0200 |
commit | 5f4f8b1129659adb2015ce42821faccf8fe6d8d5 (patch) | |
tree | 9fdb07036f2461a01f8efa1f5d07f496191e71bc /grapher/StapParser.cxx | |
parent | 95ddfc079a1d9affdb285f7690f8d5623cd7124a (diff) | |
download | systemtap-steved-5f4f8b1129659adb2015ce42821faccf8fe6d8d5.tar.gz systemtap-steved-5f4f8b1129659adb2015ce42821faccf8fe6d8d5.tar.xz systemtap-steved-5f4f8b1129659adb2015ce42821faccf8fe6d8d5.zip |
Templatize GraphData
* grapher/GraphData.hxx (GraphDataBase): new superclass for
GraphData. Split time data out as a separate vector.
(GraphData): Rewrite as template.
* grapher/GraphWidget.cxx (on_expose_event): Reflect GraphData
templatization. Handle events with string values.
* grapher/GraphWidget.hxx (GraphWidget): Keep pointers to
GraphDataBase objects instead of GraphData.
* grapher/StapParser.cxx (parseData): new member function
(ioCallback): Handle new discreet event
* grapher/StapParser.hxx (StapParser): keep pointers to GraphDataBase
objects instead of GraphData
* testsuite/systemtap.examples/general/grapher.stp: Display actual key
pressed for keyboard event
Diffstat (limited to 'grapher/StapParser.cxx')
-rw-r--r-- | grapher/StapParser.cxx | 77 |
1 files changed, 59 insertions, 18 deletions
diff --git a/grapher/StapParser.cxx b/grapher/StapParser.cxx index c973b0aa..8b72f93b 100644 --- a/grapher/StapParser.cxx +++ b/grapher/StapParser.cxx @@ -1,6 +1,7 @@ #include "StapParser.hxx" #include <gtkmm/window.h> +#include <iostream> namespace systemtap { @@ -27,6 +28,29 @@ vector<string> commaSplit(const string& inStr, size_t pos = 0) return result; } + void StapParser::parseData(std::tr1::shared_ptr<GraphDataBase> gdata, + double time, const string& dataString) + { + std::istringstream stream(dataString); + std::tr1::shared_ptr<GraphData<double> > dblptr; + std::tr1::shared_ptr<GraphData<string> > strptr; + dblptr = std::tr1::dynamic_pointer_cast<GraphData<double> >(gdata); + if (dblptr) + { + double data; + stream >> data; + dblptr->times.push_back(time); + dblptr->data.push_back(data); + } + else if ((strptr = std::tr1 + ::dynamic_pointer_cast<GraphData<string> >(gdata)) + != 0) + { + strptr->times.push_back(time); + strptr->data.push_back(dataString); + } + } + bool StapParser::ioCallback(Glib::IOCondition ioCondition) { using namespace std; @@ -71,20 +95,38 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) } else if ((found = dataString.find("%DataSet:") == 0)) { - std::tr1::shared_ptr<GraphData> dataSet(new GraphData); std::string setName; int hexColor; + double scale; std::string style; std::istringstream stream(dataString.substr(9)); - stream >> setName >> dataSet->scale >> std::hex >> hexColor + stream >> setName >> scale >> std::hex >> hexColor >> style; - dataSet->color[0] = (hexColor >> 16) / 255.0; - dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; - dataSet->color[2] = (hexColor & 0xff) / 255.0; - if (style == "dot") - dataSet->style = GraphData::DOT; - _dataSets.insert(std::make_pair(setName, dataSet)); - _widget.addGraphData(dataSet); + if (style == "bar" || style == "dot") + { + std::tr1::shared_ptr<GraphData<double> > + dataSet(new GraphData<double>); + if (style == "dot") + dataSet->style = GraphDataBase::DOT; + dataSet->color[0] = (hexColor >> 16) / 255.0; + dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; + dataSet->color[2] = (hexColor & 0xff) / 255.0; + dataSet->scale = scale; + _dataSets.insert(std::make_pair(setName, dataSet)); + _widget.addGraphData(dataSet); + } + else if (style == "discreet") + { + std::tr1::shared_ptr<GraphData<string> > + dataSet(new GraphData<string>); + dataSet->style = GraphDataBase::EVENT; + dataSet->color[0] = (hexColor >> 16) / 255.0; + dataSet->color[1] = ((hexColor >> 8) & 0xff) / 255.0; + dataSet->color[2] = (hexColor & 0xff) / 255.0; + dataSet->scale = scale; + _dataSets.insert(std::make_pair(setName, dataSet)); + _widget.addGraphData(dataSet); + } } else if ((found = dataString.find("%CSV:") == 0)) { @@ -96,8 +138,9 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) { DataMap::iterator setIter = _dataSets.find(*tokIter); if (setIter != _dataSets.end()) - _csv.elements.push_back(CSVData::Element(*tokIter, - setIter->second)); + _csv.elements + .push_back(CSVData::Element(*tokIter, + setIter->second)); } } } @@ -115,23 +158,21 @@ bool StapParser::ioCallback(Glib::IOCondition ioCondition) tokIter != e; ++tokIter, ++i) { - std::istringstream stream(*tokIter); - double data; - stream >> data; - _csv.elements[i].second - ->data.push_back(std::make_pair(time, data)); + parseData(_csv.elements[i].second, time, *tokIter); } } else { std::string dataSet; double time; - double data; + string data; std::istringstream stream(dataString); stream >> dataSet >> time >> data; DataMap::iterator itr = _dataSets.find(dataSet); if (itr != _dataSets.end()) - itr->second->data.push_back(std::make_pair(time, data)); + { + parseData(itr->second, time, data); + } } } _buffer.erase(0, ret + 1); |