Tesseract
3.02
|
00001 /* -*-C-*- 00002 ******************************************************************************** 00003 * 00004 * File: helpers.h 00005 * Description: General utility functions 00006 * Author: Daria Antonova 00007 * Created: Wed Apr 8 14:37:00 2009 00008 * Language: C++ 00009 * Package: N/A 00010 * Status: Reusable Software Component 00011 * 00012 * (c) Copyright 2009, Google Inc. 00013 ** Licensed under the Apache License, Version 2.0 (the "License"); 00014 ** you may not use this file except in compliance with the License. 00015 ** You may obtain a copy of the License at 00016 ** http://www.apache.org/licenses/LICENSE-2.0 00017 ** Unless required by applicable law or agreed to in writing, software 00018 ** distributed under the License is distributed on an "AS IS" BASIS, 00019 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00020 ** See the License for the specific language governing permissions and 00021 ** limitations under the License. 00022 * 00023 ********************************************************************************/ 00024 00025 #ifndef TESSERACT_CCUTIL_HELPERS_H_ 00026 #define TESSERACT_CCUTIL_HELPERS_H_ 00027 00028 #include <stdio.h> 00029 #include <string.h> 00030 00031 // Remove newline (if any) at the end of the string. 00032 inline void chomp_string(char *str) { 00033 int last_index = strlen(str) - 1; 00034 while (last_index >= 0 && 00035 (str[last_index] == '\n' || str[last_index] == '\r')) { 00036 str[last_index--] = '\0'; 00037 } 00038 } 00039 00040 // Advance the current pointer of the file if it points to a newline character. 00041 inline void SkipNewline(FILE *file) { 00042 if (fgetc(file) != '\n') fseek(file, -1, SEEK_CUR); 00043 } 00044 00045 // qsort function to sort 2 floats. 00046 inline int sort_floats(const void *arg1, const void *arg2) { 00047 float diff = *((float *) arg1) - *((float *) arg2); 00048 if (diff > 0) { 00049 return 1; 00050 } else if (diff < 0) { 00051 return -1; 00052 } else { 00053 return 0; 00054 } 00055 } 00056 00057 // return the smallest multiple of block_size greater than or equal to n. 00058 inline int RoundUp(int n, int block_size) { 00059 return block_size * ((n + block_size - 1) / block_size); 00060 } 00061 00062 // Clip a numeric value to the interval [lower_bound, upper_bound]. 00063 template<typename T> 00064 inline T ClipToRange(const T& x, const T& lower_bound, const T& upper_bound) { 00065 if (x < lower_bound) 00066 return lower_bound; 00067 if (x > upper_bound) 00068 return upper_bound; 00069 return x; 00070 } 00071 00072 // Extend the range [lower_bound, upper_bound] to include x. 00073 template<typename T1, typename T2> 00074 inline void UpdateRange(const T1& x, T2* lower_bound, T2* upper_bound) { 00075 if (x < *lower_bound) 00076 *lower_bound = x; 00077 if (x > *upper_bound) 00078 *upper_bound = x; 00079 } 00080 00081 // Decrease lower_bound to be <= x_lo AND increase upper_bound to be >= x_hi. 00082 template<typename T1, typename T2> 00083 inline void UpdateRange(const T1& x_lo, const T1& x_hi, 00084 T2* lower_bound, T2* upper_bound) { 00085 if (x_lo < *lower_bound) 00086 *lower_bound = x_lo; 00087 if (x_hi > *upper_bound) 00088 *upper_bound = x_hi; 00089 } 00090 00091 // Intersect the range [*lower2, *upper2] with the range [lower1, upper1], 00092 // putting the result back in [*lower2, *upper2]. 00093 // If non-intersecting ranges are given, we end up with *lower2 > *upper2. 00094 template<typename T> 00095 inline void IntersectRange(const T& lower1, const T& upper1, 00096 T* lower2, T* upper2) { 00097 if (lower1 > *lower2) 00098 *lower2 = lower1; 00099 if (upper1 < *upper2) 00100 *upper2 = upper1; 00101 } 00102 00103 // Proper modulo arithmetic operator. Returns a mod b that works for -ve a. 00104 // For any integer a and positive b, returns r : 0<=r<b and a=n*b + r for 00105 // some integer n. 00106 inline int Modulo(int a, int b) { 00107 return (a % b + b) % b; 00108 } 00109 00110 // Integer division operator with rounding that works for negative input. 00111 // Returns a divided by b, rounded to the nearest integer, without double 00112 // counting at 0. With simple rounding 1/3 = 0, 0/3 = 0 -1/3 = 0, -2/3 = 0, 00113 // -3/3 = 0 and -4/3 = -1. 00114 // I want 1/3 = 0, 0/3 = 0, -1/3 = 0, -2/3 = -1, -3/3 = -1 and -4/3 = -1. 00115 inline int DivRounded(int a, int b) { 00116 if (b < 0) return -DivRounded(a, -b); 00117 return a >= 0 ? (a + b / 2) / b : (a - b / 2) / b; 00118 } 00119 00120 // Return a double cast to int with rounding. 00121 inline int IntCastRounded(double x) { 00122 return x >= 0.0 ? static_cast<int>(x + 0.5) : -static_cast<int>(-x + 0.5); 00123 } 00124 00125 // Reverse the order of bytes in a n byte quantity for big/little-endian switch. 00126 inline void ReverseN(void* ptr, int num_bytes) { 00127 char *cptr = reinterpret_cast<char *>(ptr); 00128 int halfsize = num_bytes / 2; 00129 for (int i = 0; i < halfsize; ++i) { 00130 char tmp = cptr[i]; 00131 cptr[i] = cptr[num_bytes - 1 - i]; 00132 cptr[num_bytes - 1 - i] = tmp; 00133 } 00134 } 00135 00136 // Reverse the order of bytes in a 16 bit quantity for big/little-endian switch. 00137 inline void Reverse16(void *ptr) { 00138 ReverseN(ptr, 2); 00139 } 00140 00141 // Reverse the order of bytes in a 32 bit quantity for big/little-endian switch. 00142 inline void Reverse32(void *ptr) { 00143 ReverseN(ptr, 4); 00144 } 00145 00146 // Reverse the order of bytes in a 64 bit quantity for big/little-endian switch. 00147 inline void Reverse64(void* ptr) { 00148 ReverseN(ptr, 8); 00149 } 00150 00151 00152 #endif // TESSERACT_CCUTIL_HELPERS_H_