MathUtils.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #ifndef CNTM_MATHUTILS_H
00015 #define CNTM_MATHUTILS_H
00016 
00017 namespace Cntm
00018 {
00019 
00020         /**
00021          * Минимум.
00022          * \ingroup Utils
00023          */
00024         template < typename Type >
00025                 inline const Type & Min(const Type & value1, const Type & value2)
00026         {
00027                 return (value1 < value2) ? value1 : value2;
00028         }
00029 
00030         /**
00031          * Максимум.
00032          * \ingroup Utils
00033          */
00034         template < typename Type >
00035                 inline const Type & Max(const Type & value1, const Type & value2)
00036         {
00037                 return (value1 > value2) ? value1 : value2;
00038         }
00039 
00040         /**
00041          * Целочисленное деление с округлением в большую сторону.
00042          * \ingroup Utils
00043          */
00044         template < typename Type >
00045                 inline Type DivIntGreatRound(Type value1, Type value2)
00046         {
00047                 return (value1 + value2 - 1) / value2;
00048         }
00049 
00050         /**
00051          * Обмен эл-тов.
00052          * \ingroup Utils
00053          */
00054         template < typename Type >
00055                 inline void Exchange(Type & value1, Type & value2)
00056         {
00057                 Type temp = value1;
00058                 value1 = value2;
00059                 value2 = temp;
00060         }
00061 
00062         /**
00063          * Функции работы с отрезком (оба конца входят в отрезок).
00064          * Проверить значение на попадание в пределы отрезка.
00065          * \ingroup Utils
00066          */
00067         template < typename Type >
00068                 inline bool InRange(const Type & value, const Type & low, const Type & high)
00069         {
00070                 return !OutRange(value, low, high);
00071         }
00072 
00073         /**
00074          * Проверить значение на выход за пределы отрезка (оба конца входят в отрезок).
00075          * \ingroup Utils
00076          */
00077         template < typename Type >
00078                 inline bool OutRange(const Type & value, const Type & low, const Type & high)
00079         {
00080                 return ((low > value) || (value > high));
00081         }
00082 
00083         /**
00084          * Отсечь значение по указанным пределам отрезка (оба конца входят в отрезок).
00085          * \ingroup Utils
00086          */
00087         template < typename Type >
00088                 inline const Type & TrimRange(const Type & value, const Type & low, const Type & high)
00089         {
00090                 return Max(low, Min(value, high));
00091         }
00092 
00093         /**
00094          * Индекс отрезка. Результат: -1 - до граниицы, 0 - на границе, 1 - после границы.
00095          * \ingroup Utils
00096          */
00097         template < typename Type >
00098                 inline int RangeIndex(const Type & value, const Type & bound)
00099         {
00100                 if (value < bound) return -1;
00101                 else if (value > bound) return 1;
00102                 else return 0;
00103         }
00104 
00105         /**
00106          * Индекс отрезка (оба конца входят в отрезок). Результат: -1 - до low граниицы, 0 - в отрезке, 1 - после high границы.
00107          * \ingroup Utils
00108          */
00109         template < typename Type >
00110                 inline int RangeIndex(const Type & value, const Type & low, const Type & high)
00111         {
00112                 if (value < low) return -1;
00113                 else if (value > high) return 1;
00114                 else return 0;
00115         }
00116 
00117         /**
00118          * Функции работы с интервалом (левый конец входит в интервал, правый - нет).
00119          * Проверить значение на попадание в пределы интервала.
00120          * \ingroup Utils
00121          */
00122         template < typename Type >
00123                 inline bool InInterval(const Type & value, const Type & low, const Type & high)
00124         {
00125                 return !OutInterval(value, low, high);
00126         }
00127 
00128         /**
00129          * Проверить значение на выход за пределы интервала (левый конец входит в интервал, правый - нет).
00130          * \ingroup Utils
00131          */
00132         template < typename Type >
00133                 inline bool OutInterval(const Type & value, const Type & low, const Type & high)
00134         {
00135                 return ((low > value) || !(value < high));
00136         }
00137 
00138         /**
00139          * Индекс интервала (левый конец входит в интервал, правый - нет). Результат: -1 - до low граниицы, 0 - в интервале, 1 - после или на high границе.
00140          * \ingroup Utils
00141          */
00142         template < typename Type >
00143                 inline int IntervalIndex(const Type & value, const Type & low, const Type & high)
00144         {
00145                 if (value < low) return -1;
00146                 else if (value < high) return 0;
00147                 else return 1;
00148         }
00149 
00150 }
00151 
00152 #endif //CNTM_MATHUTILS_H

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3