110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology 210448Snilay@cs.wisc.edu * 310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy 410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal 510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights 610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is 810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions: 910448Snilay@cs.wisc.edu * 1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in 1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software. 1210448Snilay@cs.wisc.edu * 1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1910448Snilay@cs.wisc.edu * THE SOFTWARE. 2010448Snilay@cs.wisc.edu */ 2110448Snilay@cs.wisc.edu 2210447Snilay@cs.wisc.edu#ifndef __DSENT_UTIL_RESULT_H__ 2310447Snilay@cs.wisc.edu#define __DSENT_UTIL_RESULT_H__ 2410447Snilay@cs.wisc.edu 2510447Snilay@cs.wisc.edu#include <iostream> 2610447Snilay@cs.wisc.edu#include <vector> 2710447Snilay@cs.wisc.edu 2810447Snilay@cs.wisc.edu#include "libutil/String.h" 2910447Snilay@cs.wisc.edu#include "libutil/Map.h" 3010447Snilay@cs.wisc.edu 3110447Snilay@cs.wisc.edunamespace DSENT 3210447Snilay@cs.wisc.edu{ 3310447Snilay@cs.wisc.edu using std::ostream; 3410447Snilay@cs.wisc.edu using std::vector; 3510447Snilay@cs.wisc.edu using LibUtil::Map; 3610447Snilay@cs.wisc.edu using LibUtil::String; 3710447Snilay@cs.wisc.edu 3810447Snilay@cs.wisc.edu class Result 3910447Snilay@cs.wisc.edu { 4010447Snilay@cs.wisc.edu public: 4110447Snilay@cs.wisc.edu class SubResult 4210447Snilay@cs.wisc.edu { 4310447Snilay@cs.wisc.edu public: 4410447Snilay@cs.wisc.edu SubResult(const Result* result_, const String& producer_, double num_results_); 4510447Snilay@cs.wisc.edu ~SubResult(); 4610447Snilay@cs.wisc.edu 4710447Snilay@cs.wisc.edu public: 4810447Snilay@cs.wisc.edu const Result* getResult() const; 4910447Snilay@cs.wisc.edu const String& getProducer() const; 5010447Snilay@cs.wisc.edu double getNumResults() const; 5110447Snilay@cs.wisc.edu 5210447Snilay@cs.wisc.edu SubResult* clone() const; 5310447Snilay@cs.wisc.edu 5410447Snilay@cs.wisc.edu protected: 5510447Snilay@cs.wisc.edu SubResult(const SubResult& sub_result_); 5610447Snilay@cs.wisc.edu 5710447Snilay@cs.wisc.edu private: 5810447Snilay@cs.wisc.edu // Pointer to the actual result 5910447Snilay@cs.wisc.edu const Result* m_result_; 6010447Snilay@cs.wisc.edu // Name of the instance that produces this result 6110447Snilay@cs.wisc.edu String m_producer_; 6210447Snilay@cs.wisc.edu // Number of the times this result should be produce 6310447Snilay@cs.wisc.edu double m_num_results_; 6410447Snilay@cs.wisc.edu }; // class SubResult 6510447Snilay@cs.wisc.edu 6610447Snilay@cs.wisc.edu public: 6710447Snilay@cs.wisc.edu Result(); 6810447Snilay@cs.wisc.edu Result(const String& result_name_); 6910447Snilay@cs.wisc.edu virtual ~Result(); 7010447Snilay@cs.wisc.edu 7110447Snilay@cs.wisc.edu public: 7210447Snilay@cs.wisc.edu // Get the name of result 7310447Snilay@cs.wisc.edu const String& getName() const; 7410447Snilay@cs.wisc.edu // Add a sub result 7510447Snilay@cs.wisc.edu void addSubResult(const Result* sub_result_, const String& result_producer_, double num_results_); 7610447Snilay@cs.wisc.edu // Remove all sub results 7710447Snilay@cs.wisc.edu void removeAllSubResults(); 7810447Snilay@cs.wisc.edu // Set the value of a result, not available except for AtomicResult 7910447Snilay@cs.wisc.edu virtual void setValue(double value_); 8010447Snilay@cs.wisc.edu // Set the value of a result, not available except for AtomicResult 8110447Snilay@cs.wisc.edu virtual void addValue(double value_); 8210447Snilay@cs.wisc.edu // Get the value of a result, not available except for AtomicResult 8310447Snilay@cs.wisc.edu virtual double getValue() const; 8410447Snilay@cs.wisc.edu // Loop through all sub results and calculate the sum 8510447Snilay@cs.wisc.edu virtual double calculateSum() const; 8610447Snilay@cs.wisc.edu // Print the result with hierarchy if detail_level_ > 0. Print the sum when detail_level_ <= 0 8710447Snilay@cs.wisc.edu void print(const String& prepend_str_, int detail_level_, ostream& ost_) const; 8810447Snilay@cs.wisc.edu // Print the tree of the results 8910447Snilay@cs.wisc.edu void printHierarchy(const String& prepend_str_, int detail_level_, ostream& ost_) const; 9010447Snilay@cs.wisc.edu 9110447Snilay@cs.wisc.edu Result* clone() const; 9210447Snilay@cs.wisc.edu 9310447Snilay@cs.wisc.edu protected: 9410447Snilay@cs.wisc.edu Result(const Result& result_); 9510447Snilay@cs.wisc.edu virtual void print(const String& prepend_str_, double num_results_, int detail_level_, ostream& ost_) const; 9610447Snilay@cs.wisc.edu 9710447Snilay@cs.wisc.edu private: 9810447Snilay@cs.wisc.edu String m_result_name_; 9910447Snilay@cs.wisc.edu vector<SubResult*> m_sub_results_; 10010447Snilay@cs.wisc.edu }; // class Result 10110447Snilay@cs.wisc.edu 10210447Snilay@cs.wisc.edu class AtomicResult : public Result 10310447Snilay@cs.wisc.edu { 10410447Snilay@cs.wisc.edu public: 10510447Snilay@cs.wisc.edu AtomicResult(const String& result_name_, double value_ = 0.0); 10610447Snilay@cs.wisc.edu ~AtomicResult(); 10710447Snilay@cs.wisc.edu 10810447Snilay@cs.wisc.edu public: 10910447Snilay@cs.wisc.edu void setValue(double value_); 11010447Snilay@cs.wisc.edu void addValue(double value_); 11110447Snilay@cs.wisc.edu double getValue() const; 11210447Snilay@cs.wisc.edu virtual double calculateSum() const; 11310447Snilay@cs.wisc.edu AtomicResult* clone() const; 11410447Snilay@cs.wisc.edu 11510447Snilay@cs.wisc.edu protected: 11610447Snilay@cs.wisc.edu AtomicResult(const AtomicResult& atomic_result_); 11710447Snilay@cs.wisc.edu virtual void print(const String& prepend_str_, double num_results_, int detail_level_, ostream& ost_) const; 11810447Snilay@cs.wisc.edu 11910447Snilay@cs.wisc.edu private: 12010447Snilay@cs.wisc.edu // Actual value of the result 12110447Snilay@cs.wisc.edu double m_value_; 12210447Snilay@cs.wisc.edu }; // class AtomicResult 12310447Snilay@cs.wisc.edu} // namespace DSENT 12410447Snilay@cs.wisc.edu 12510447Snilay@cs.wisc.edu#endif // __DSENT_UTIL_RESULT_H__ 12610447Snilay@cs.wisc.edu 127