/** * Copyright Mikael Högdahl - triyana@users.sourceforge.net * * This source is distributed under the terms of the Q Public License version 1.0, * created by Trolltech (www.trolltech.com). */ #include "MHUtil.h" #include "MHDate.h" /** * Create a pointer to char * @param int - Rows * @param int - Size fo row * @return char** - Allocated string, remember to delete later */ char** MHUtil::Allocate (int rows, int size) { char** s = new char*[rows]; for (int f = 0; f < rows; f++) { s[f] = new char[size]; s[f][0] = '\0'; } return s; } /** * Allocate new buffer * @param char* - Old string * @param int - Size * @return char* - New string */ char* MHUtil::Allocate (char* old, int& size) { char* nw = new char[size * 2]; strcpy (nw, old); delete []old; size = size * 2; return nw; } /** * Append buffer to another buffer * @param char* - String 1 * @param const char* - String 2 * @param int - Size of destination buffer * @return char* - Destination string */ char* MHUtil::AppendString (char* s1, const char* s2, int& size) { if (s1 && s2) { int len1 = STRLEN (s1); int len2 = STRLEN (s2); int tot = len1 + len2; if ((tot + 1) >= size) { char* tmp = new char [tot * 2]; strcpy (tmp, s1); strcat (tmp, s2); delete []s1; s1 = tmp; size = tot * 2; } else { strcat (s1, s2); } } return s1; } /** * Append buffer to another buffer * @param char* - String 1 * @param const - String 2 * @param int - Size of destination buffer * @return char* - Destination string */ char* MHUtil::AppendChar (char* s1, char s2, int& size) { if (s1) { int len1 = STRLEN (s1); if ((len1 + 1) >= size) { char* tmp = new char [len1 * 2]; strcpy (tmp, s1); tmp[len1] = s2; tmp[len1 + 1] = '\0'; delete []s1; s1 = tmp; size = len1 * 2; } else { s1[len1] = s2; s1[len1 + 1] = '\0';; } } return s1; } /** * Get current market price of a bond. * @param double - Interest value * @param double - Interest rate, in percent * @param double - Maturity value of bond * @param int - Years to maturity * @return double - Value */ double MHUtil::BondValue (double interest_value, double interest, double maturity, int years_maturity) { double value = 0; interest /= 100; for (int f = 1; f <= years_maturity; f++) { value += interest_value / (pow (1.0 + interest, f)); } value += maturity / (pow (1.0 + interest, years_maturity)); return value; } /** * Return change in percent * @param double - Start number * @param double - Stop number * @return double - Change in percent */ double MHUtil::Change (double start, double stop) { double diff = stop - start; if (fabs (start) > 0.0000000001) return (diff / start) * 100.0; else return 0; } /** * Delete a pointer to char * @param char** - String * @param int - Rows */ void MHUtil::Delete (char** s, int rows) { for (int f = 0; f < rows; f++) delete s[f]; delete []s; } /** * Set fraction width. * @return double - Number to use for calculations of the fraction size * return int - Fraction size */ int MHUtil::GetFractionSize (double d) { double dd = d; int fr = 0; dd = fabs (dd); dd = dd - int(dd); while (dd <= 1.0000000 && dd > 0.000000) { fr++; dd *= 10; } return fr; } /** * Set integer width * @param double - Number to use as a base * return int - Integer size */ int MHUtil::GetIntegerSize (double d) { double dd = fabs (d); int is = 0; while (dd >= 1.00000000) { dd /= 10; is++; } if (d < 0) is++; return is; } /** * Return interest. * @param const char* - Start date * @param const char* - Stop date * @param double - Interest / year in percent * @return double - Interest between start and stop date */ double MHUtil::Interest (const char* d1, const char* d2, double nInterest) { double years = MHDate::NoYears (d1, d2); nInterest /= 100; nInterest += 1.0; nInterest = pow (nInterest, years); nInterest -= 1.0; return (nInterest * 100); } /** * Return interst. * @param const char* - Start date * @param const char* - Stop date * @param double - Amount * @param double - Interest / year in percent * @return double - Interest between start and stop date */ double MHUtil::Interest (const char* d1, const char* d2, double nValue, double nInterest) { double interest = MHUtil::Interest (d1, d2, nInterest); return MHUtil::ChangeVal (nValue, interest); } /** * Create hash from number * @param int - Key to hash * @param int - Hash size * @return int - Hash number */ int MHUtil::IntHash (int key, int size) { key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); return (key % size); } /** * Return change in percent * @param double - First number * @param double - Second number * @return double - Percent (second/first) 10, 5 = 200 */ double MHUtil::PercentOf (double a, double b) { if (fabs (b) > 0.0000000001) return (a / b) * 100; else return 0; } /** * Rounds a number. * @param int - Integer size * @param int - Fraction size * @param double - Number to round * @return double - The rounded number */ double MHUtil::Round (int in, int fr, double d) { int f; if (in > 0) { for (f = in; f > 0; f--) d /= 10; d = int(d); for (f = in; f > 0; f--) d *= 10; } else if (fr > 0) { for (f = fr; f > 1; f--) d *= 10; d = int(d); for (f = fr; f > 1; f--) d /= 10; } return d; } /** * Create hash number from key. * @param const char* - Key to hash * @param int - Size of hash * @return int - Hash number */ int MHUtil::StringHash (const char* key, int size) { int i; for (i = 0; *key; key++) i = 131 * i + *key; return abs (i % size); } /** * Get time. * @return double - Number of seconds */ double MHUtil::Time () { #ifdef WIN32 struct _timeb TimeVal; _ftime (&TimeVal); return TimeVal.time + (double (TimeVal.millitm) / 1000.0); #else timeb t; ftime (&t); return t.time + (double (t.millitm) / 1000.0); #endif }