| /* Copyright (c) 2012 Massachusetts Institute of Technology | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a copy | |
| * of this software and associated documentation files (the "Software"), to deal | |
| * in the Software without restriction, including without limitation the rights | |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| * copies of the Software, and to permit persons to whom the Software is | |
| * furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be included in | |
| * all copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| * THE SOFTWARE. | |
| */ | |
| #ifndef __DSENT_UTIL_RESULT_H__ | |
| #define __DSENT_UTIL_RESULT_H__ | |
| #include <iostream> | |
| #include <vector> | |
| #include "libutil/String.h" | |
| #include "libutil/Map.h" | |
| namespace DSENT | |
| { | |
| using std::ostream; | |
| using std::vector; | |
| using LibUtil::Map; | |
| using LibUtil::String; | |
| class Result | |
| { | |
| public: | |
| class SubResult | |
| { | |
| public: | |
| SubResult(const Result* result_, const String& producer_, double num_results_); | |
| ~SubResult(); | |
| public: | |
| const Result* getResult() const; | |
| const String& getProducer() const; | |
| double getNumResults() const; | |
| SubResult* clone() const; | |
| protected: | |
| SubResult(const SubResult& sub_result_); | |
| private: | |
| // Pointer to the actual result | |
| const Result* m_result_; | |
| // Name of the instance that produces this result | |
| String m_producer_; | |
| // Number of the times this result should be produce | |
| double m_num_results_; | |
| }; // class SubResult | |
| public: | |
| Result(); | |
| Result(const String& result_name_); | |
| virtual ~Result(); | |
| public: | |
| // Get the name of result | |
| const String& getName() const; | |
| // Add a sub result | |
| void addSubResult(const Result* sub_result_, const String& result_producer_, double num_results_); | |
| // Remove all sub results | |
| void removeAllSubResults(); | |
| // Set the value of a result, not available except for AtomicResult | |
| virtual void setValue(double value_); | |
| // Set the value of a result, not available except for AtomicResult | |
| virtual void addValue(double value_); | |
| // Get the value of a result, not available except for AtomicResult | |
| virtual double getValue() const; | |
| // Loop through all sub results and calculate the sum | |
| virtual double calculateSum() const; | |
| // Print the result with hierarchy if detail_level_ > 0. Print the sum when detail_level_ <= 0 | |
| void print(const String& prepend_str_, int detail_level_, ostream& ost_) const; | |
| // Print the tree of the results | |
| void printHierarchy(const String& prepend_str_, int detail_level_, ostream& ost_) const; | |
| Result* clone() const; | |
| protected: | |
| Result(const Result& result_); | |
| virtual void print(const String& prepend_str_, double num_results_, int detail_level_, ostream& ost_) const; | |
| private: | |
| String m_result_name_; | |
| vector<SubResult*> m_sub_results_; | |
| }; // class Result | |
| class AtomicResult : public Result | |
| { | |
| public: | |
| AtomicResult(const String& result_name_, double value_ = 0.0); | |
| ~AtomicResult(); | |
| public: | |
| void setValue(double value_); | |
| void addValue(double value_); | |
| double getValue() const; | |
| virtual double calculateSum() const; | |
| AtomicResult* clone() const; | |
| protected: | |
| AtomicResult(const AtomicResult& atomic_result_); | |
| virtual void print(const String& prepend_str_, double num_results_, int detail_level_, ostream& ost_) const; | |
| private: | |
| // Actual value of the result | |
| double m_value_; | |
| }; // class AtomicResult | |
| } // namespace DSENT | |
| #endif // __DSENT_UTIL_RESULT_H__ | |