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