Пример #1
0
			double 
			generate_uniform(
				double min,
				double max
				)
			{
				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::generate_uniform");

				SERIALIZE_CALL(std::recursive_mutex, __random_lock);

				double result;
				std::uniform_real_distribution<double> uniform_dist;

				if(!__random_initialized) {
					THROW_RANDOM_EXCEPTION(RANDOM_EXCEPTION_UNINITIALIZED);
				}

				if(min > max) {
					THROW_RANDOM_EXCEPTION_MESSAGE(
						RANDOM_EXCEPTION_INVALID_PARAMETER,
						"min > max"
						);
				}
				result = ((max - min) * uniform_dist(__random_generator)) + min;

				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::generate_uniform, result. " << result);

				return result;
			}
Пример #2
0
			double 
			generate_normalized(
				double mean,
				double sigma,
				double crop_min,
				double crop_max
				)
			{
				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::generate_normalized");

				SERIALIZE_CALL(std::recursive_mutex, __random_lock);

				double result;
				std::normal_distribution<double> normal_dist(mean, sigma);

				if(!__random_initialized) {
					THROW_RANDOM_EXCEPTION(RANDOM_EXCEPTION_UNINITIALIZED);
				}

				if(sigma < 0.0) {
					THROW_RANDOM_EXCEPTION_MESSAGE(
						RANDOM_EXCEPTION_INVALID_PARAMETER,
						"spread < 0.0"
						);
				}

				if(crop_min > crop_max) {
					THROW_RANDOM_EXCEPTION_MESSAGE(
						RANDOM_EXCEPTION_INVALID_PARAMETER,
						"crop_min > crop_max"
						);
				}
				result = normal_dist(__random_generator);

				if(result < crop_min) {
					result = crop_min;
				} else if(result > crop_max) {
					result = crop_max;
				}

				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::generate_normalized, result. " << result);

				return result;
			}
Пример #3
0
			void 
			initialize(
				uint32_t seed
				)
			{
				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::initialize");

				SERIALIZE_CALL(std::recursive_mutex, __random_lock);

				std::srand((uint32_t) std::time(NULL));

				if(seed == GENERATE_RANDOM_SEED) {
					__random_generator.seed(rand());
				} else {
					__random_generator.seed(seed);
				}
				__random_initialized = true;

				TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::initialize");
			}
Пример #4
0
	void 
	_nimble_trace::generate(
		__in nimble_lvl_t level,
		__in const std::string &header,
		__in const std::string &funct,
		__in const std::string &source,
		__in size_t line,
		__in const char *format,
		...
		)
	{
		std::time_t tm;
		std::string buf, tmstr;
		std::stringstream result;
		SERIALIZE_CALL(m_lock);

		if(nimble_trace::m_started) {
			tm = std::time(NULL);
			tmstr = std::asctime(std::localtime(&tm));
			result << "[" << tmstr.substr(0, tmstr.size() - 1) << "] ";

			if(!header.empty()) {
				result << CHK_STR(header);
			}

			if(!funct.empty()) {
				result << CHK_STR(funct);
			}

			if(format) {
				va_list lst;
				va_start(lst, format);

				int len = vsnprintf(NULL, 0, format, lst);
				if(len < 0) {
					buf = NIMBLE_TRACE_EXCEPTION_STRING(
						NIMBLE_TRACE_EXCEPTION_MALFORMED);
				} else if(!len) {
					buf = NIMBLE_TRACE_EXCEPTION_STRING(
						NIMBLE_TRACE_EXCEPTION_EMPTY);
				} else {
					va_end(lst);
					va_start(lst, format);
					buf.resize(++len, '\0');

					len = vsnprintf((char *) &buf[0], len, format, lst);
					if(len < 0) {
						buf = NIMBLE_TRACE_EXCEPTION_STRING(
							NIMBLE_TRACE_EXCEPTION_MALFORMED);
					} else if(!len) {
						buf = NIMBLE_TRACE_EXCEPTION_STRING(
							NIMBLE_TRACE_EXCEPTION_EMPTY);
					}
				}

				va_end(lst);

				if(!buf.empty()) {
					result << ": " << CHK_STR(buf);
				}
			}

			result << " (";

			if(!source.empty()) {
				result << source << ":";
			}

			result << line << ")";

			switch(level) {
				case TRACE_ERROR:
					SET_TERM_ATTRIB(nimble_trace::m_stream, 1, COL_FORE_RED);
					nimble_trace::m_stream << CHK_STR(result.str()) << std::endl;
					CLEAR_TERM_ATTRIB(nimble_trace::m_stream);
					break;
				case TRACE_WARNING:
					SET_TERM_ATTRIB(nimble_trace::m_stream, 1, COL_FORE_YELLOW);
					nimble_trace::m_stream << CHK_STR(result.str()) << std::endl;
					CLEAR_TERM_ATTRIB(nimble_trace::m_stream);
					break;
				default:
					nimble_trace::m_stream << CHK_STR(result.str()) << std::endl;
					break;
			}
		}
	}