00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "ers/RangeIssue.h"
00011 #include <sstream>
00012
00013
00014 const char * const ers::RangeIssue::CLASS_NAME = "ers::RangeIssue" ;
00015 const char * const ers::RangeIssue::INDEX_REFERENCE_TYPE = "scalar" ;
00016 const char * const ers::RangeIssue::RANGE_MIN_KEY = "REFERENCE_RANGE_MIN" ;
00017 const char * const ers::RangeIssue::RANGE_MAX_KEY = "REFERENCE_RANGE_MAX" ;
00018
00019
00020 namespace {
00021 ers::Issue *create_issue() { return new ers::RangeIssue(); }
00022 bool registered = ers::IssueFactory::instance()->register_issue(ers::RangeIssue::CLASS_NAME,create_issue) ;
00023 }
00024
00025 void ers::RangeIssue::check_range(const ers::Context &c, int64_t min, int64_t value, int64_t max, const char* entity_name) {
00026 if ((value>max) || (value<min)) throw RangeIssue(c,ers::error,min,value,max,entity_name);
00027 }
00028
00029
00030 void ers::RangeIssue::set_range(ers::Issue &issue, int64_t index, int64_t min_index, int64_t max_index, const char* entity_name) {
00031 issue.set_value(REFERENCE_VALUE_KEY,index) ;
00032 issue.set_value(RANGE_MIN_KEY,min_index);
00033 issue.set_value(RANGE_MAX_KEY,max_index);
00034 std::ostringstream reference_stream ;
00035 reference_stream << INDEX_REFERENCE_TYPE ;
00036 if (entity_name) {
00037 reference_stream << "(name=" << entity_name << ')' ;
00038 }
00039 issue.set_value(REFERENCE_TYPE_KEY,reference_stream.str()) ;
00040 }
00041
00042 ers::RangeIssue::RangeIssue() : ers::InvalidReferenceIssue() {}
00043
00044 ers::RangeIssue::RangeIssue(const ers::Context &c, ers::severity_t s) : ers::InvalidReferenceIssue(c,s) {
00045 set_value(REFERENCE_TYPE_KEY,INDEX_REFERENCE_TYPE) ;
00046 }
00047
00048 ers::RangeIssue::RangeIssue(const ers::Context &c, ers::severity_t s, int64_t min_index, int64_t index, int64_t max_index, const char* entity_name) : ers::InvalidReferenceIssue(c,s) {
00049 set_range(*this,index,min_index,max_index,entity_name) ;
00050 std::ostringstream message_stream ;
00051 message_stream << "invalid index: " ;
00052 if (entity_name) {
00053 message_stream << entity_name << '=';
00054 }
00055 message_stream << index << " is not in range " << min_index << '-' << max_index ;
00056 finish_setup(message_stream.str());
00057 }
00058
00059 const char*ers::RangeIssue::get_class_name() const throw() { return CLASS_NAME ; }
00060