Mercurial > hg > gpsynth
diff src/std_ex.hpp @ 0:add35537fdbb tip
Initial import
author | irh <ian.r.hobson@gmail.com> |
---|---|
date | Thu, 25 Aug 2011 11:05:55 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/std_ex.hpp Thu Aug 25 11:05:55 2011 +0100 @@ -0,0 +1,162 @@ +// Copyright 2011, Ian Hobson. +// +// This file is part of gpsynth. +// +// gpsynth is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// gpsynth is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with gpsynth in the file COPYING. +// If not, see http://www.gnu.org/licenses/. + +// Miscellaneous C++ stdlib helper utilities + +#pragma once + +#include <cstdlib> +#include <iostream> +#include <iterator> +#include <fstream> +#include <map> +#include <sstream> +#include <stdexcept> +#include <string> + +namespace stdx { + +typedef unsigned int uint; + +// Helper function for retrieving values from const std::maps +template<typename M> +const typename M::mapped_type& GetFromMap(const M& map, + const typename M::key_type& key) { + typename M::const_iterator i = map.find(key); + if (i == map.end()) { + throw std::runtime_error("GetFromMap: specified key not in map."); + } + return i->second; +} + + +template<typename T> +inline T RandomRange(T min, T max) { + return static_cast<T>(((double)rand() / (float)RAND_MAX) * (max - min) + min); +} + +template<typename T> +inline T RandomRangeInt(T min, T max) { + return static_cast<T>(((double)rand() / (float)RAND_MAX) + * (max - min) + + min + 0.5); +} + +template<typename T> +inline T Random(T maximum) { + return static_cast<T>(((double)rand() / (double)RAND_MAX) * maximum); +} + +inline bool Random5050() { + return rand() > (RAND_MAX / 2); +} + +inline double RandomCoefficient() { + return static_cast<double>(rand()) / static_cast<double>(RAND_MAX); +} + +inline bool Chance(double probability) { + return RandomCoefficient() < probability; +} + +template<typename T> +class RandomGenerator { + T minimum_; + T maximum_; + +public: + RandomGenerator(T minimum = 0, T maximum = 1) + : minimum_(minimum), + maximum_(maximum) + {} + + T operator()() { + return RandomRange(minimum_, maximum_); + } +}; + + +// clamps input T to range specified by U and V +template<typename T, typename U, typename V> +T Clamp(const T& value, const U& minimum, const V& maximum) { + return (value > maximum) ? maximum : (value < minimum) ? minimum : value; +} + +// Function object that increments its internal value by the provided step size +template<typename T> +class Stepper { + T value_; + T step_size_; +public: + Stepper(const T& step_size, const T& initial_value = T()) + : value_(initial_value), + step_size_(step_size) + {} + + T operator()() { + T result = value_; + value_ += step_size_; + return result; + } +}; + +// Function object that returns true if value is less than internal value +template<typename T> +class LessThan { + T value_; +public: + LessThan(const T& value) : value_(value) {} + bool operator()(const T& other) { return other < value_; } +}; + +// writes a container to a stream +template<typename Container> +void DumpContainer(const Container& container, + const std::string& separator = "\n", + std::ostream& output = std::cout) { + typedef typename Container::value_type Value; + std::copy(container.begin(), container.end(), + std::ostream_iterator<Value>(output, separator.c_str())); +} + +// saves a container to a specified file path +template<typename Container> +void SaveContainerToFile(const Container& container, + const std::string& file_path, + const std::string& separator = "\n") { + std::ofstream file(file_path.c_str()); + DumpContainer(container, separator, file); +} + +template<typename T> +void AppendToFile(const T& value_to_append, + const std::string& file_path, + const std::string& separator = "\n") { + std::ofstream file(file_path.c_str(), + std::ofstream::app | std::ofstream::out); + file << value_to_append << separator; +} + +inline std::string LoadFile(const std::string& file_path) { + std::ifstream file(file_path.c_str()); + std::stringstream buffer; + buffer << file.rdbuf(); + return buffer.str(); +} + +} // stdx namespace