diff options
Diffstat (limited to 'build/Bonmin/include/coin/CoinHelperFunctions.hpp')
-rw-r--r-- | build/Bonmin/include/coin/CoinHelperFunctions.hpp | 1111 |
1 files changed, 0 insertions, 1111 deletions
diff --git a/build/Bonmin/include/coin/CoinHelperFunctions.hpp b/build/Bonmin/include/coin/CoinHelperFunctions.hpp deleted file mode 100644 index 3409bbc..0000000 --- a/build/Bonmin/include/coin/CoinHelperFunctions.hpp +++ /dev/null @@ -1,1111 +0,0 @@ -/* $Id: CoinHelperFunctions.hpp 1679 2013-12-05 11:27:45Z forrest $ */ -// Copyright (C) 2000, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef CoinHelperFunctions_H -#define CoinHelperFunctions_H - -#include "CoinUtilsConfig.h" - -#if defined(_MSC_VER) -# include <direct.h> -# include <cctype> -# define getcwd _getcwd -# include <cctype> -#else -# include <unistd.h> -#endif -//#define USE_MEMCPY - -#include <cstdlib> -#include <cstdio> -#include <algorithm> -#include "CoinTypes.hpp" -#include "CoinError.hpp" - -// Compilers can produce better code if they know about __restrict -#ifndef COIN_RESTRICT -#ifdef COIN_USE_RESTRICT -#define COIN_RESTRICT __restrict -#else -#define COIN_RESTRICT -#endif -#endif - -//############################################################################# - -/** This helper function copies an array to another location using Duff's - device (for a speedup of ~2). The arrays are given by pointers to their - first entries and by the size of the source array. Overlapping arrays are - handled correctly. */ - -template <class T> inline void -CoinCopyN(register const T* from, const int size, register T* to) -{ - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinCopyN", ""); -#endif - - register int n = (size + 7) / 8; - if (to > from) { - register const T* downfrom = from + size; - register T* downto = to + size; - // Use Duff's device to copy - switch (size % 8) { - case 0: do{ *--downto = *--downfrom; - case 7: *--downto = *--downfrom; - case 6: *--downto = *--downfrom; - case 5: *--downto = *--downfrom; - case 4: *--downto = *--downfrom; - case 3: *--downto = *--downfrom; - case 2: *--downto = *--downfrom; - case 1: *--downto = *--downfrom; - }while(--n>0); - } - } else { - // Use Duff's device to copy - --from; - --to; - switch (size % 8) { - case 0: do{ *++to = *++from; - case 7: *++to = *++from; - case 6: *++to = *++from; - case 5: *++to = *++from; - case 4: *++to = *++from; - case 3: *++to = *++from; - case 2: *++to = *++from; - case 1: *++to = *++from; - }while(--n>0); - } - } -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location using Duff's - device (for a speedup of ~2). The source array is given by its first and - "after last" entry; the target array is given by its first entry. - Overlapping arrays are handled correctly. - - All of the various CoinCopyN variants use an int for size. On 64-bit - architectures, the address diff last-first will be a 64-bit quantity. - Given that everything else uses an int, I'm going to choose to kick - the difference down to int. -- lh, 100823 -- -*/ -template <class T> inline void -CoinCopy(register const T* first, register const T* last, register T* to) -{ - CoinCopyN(first, static_cast<int>(last-first), to); -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The arrays are given by pointers to their first - entries and by the size of the source array. - - Note JJF - the speed claim seems to be false on IA32 so I have added - CoinMemcpyN which can be used for atomic data */ -template <class T> inline void -CoinDisjointCopyN(register const T* from, const int size, register T* to) -{ -#ifndef _MSC_VER - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinDisjointCopyN", ""); -#endif - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinDisjointCopyN", ""); -#endif - - for (register int n = size / 8; n > 0; --n, from += 8, to += 8) { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to[4] = from[4]; - to[5] = from[5]; - to[6] = from[6]; - to[7] = from[7]; - } - switch (size % 8) { - case 7: to[6] = from[6]; - case 6: to[5] = from[5]; - case 5: to[4] = from[4]; - case 4: to[3] = from[3]; - case 3: to[2] = from[2]; - case 2: to[1] = from[1]; - case 1: to[0] = from[0]; - case 0: break; - } -#else - CoinCopyN(from, size, to); -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The source array is given by its first and "after - last" entry; the target array is given by its first entry. */ -template <class T> inline void -CoinDisjointCopy(register const T* first, register const T* last, - register T* to) -{ - CoinDisjointCopyN(first, static_cast<int>(last - first), to); -} - -//----------------------------------------------------------------------------- - -/*! \brief Return an array of length \p size filled with input from \p array, - or null if \p array is null. -*/ - -template <class T> inline T* -CoinCopyOfArray( const T * array, const int size) -{ - if (array) { - T * arrayNew = new T[size]; - std::memcpy(arrayNew,array,size*sizeof(T)); - return arrayNew; - } else { - return NULL; - } -} - - -/*! \brief Return an array of length \p size filled with first copySize from \p array, - or null if \p array is null. -*/ - -template <class T> inline T* -CoinCopyOfArrayPartial( const T * array, const int size,const int copySize) -{ - if (array||size) { - T * arrayNew = new T[size]; - assert (copySize<=size); - std::memcpy(arrayNew,array,copySize*sizeof(T)); - return arrayNew; - } else { - return NULL; - } -} - -/*! \brief Return an array of length \p size filled with input from \p array, - or filled with (scalar) \p value if \p array is null -*/ - -template <class T> inline T* -CoinCopyOfArray( const T * array, const int size, T value) -{ - T * arrayNew = new T[size]; - if (array) { - std::memcpy(arrayNew,array,size*sizeof(T)); - } else { - int i; - for (i=0;i<size;i++) - arrayNew[i] = value; - } - return arrayNew; -} - - -/*! \brief Return an array of length \p size filled with input from \p array, - or filled with zero if \p array is null -*/ - -template <class T> inline T* -CoinCopyOfArrayOrZero( const T * array , const int size) -{ - T * arrayNew = new T[size]; - if (array) { - std::memcpy(arrayNew,array,size*sizeof(T)); - } else { - std::memset(arrayNew,0,size*sizeof(T)); - } - return arrayNew; -} - - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The arrays are given by pointers to their first - entries and by the size of the source array. - - Note JJF - the speed claim seems to be false on IA32 so I have added - alternative coding if USE_MEMCPY defined*/ -#ifndef COIN_USE_RESTRICT -template <class T> inline void -CoinMemcpyN(register const T* from, const int size, register T* to) -{ -#ifndef _MSC_VER -#ifdef USE_MEMCPY - // Use memcpy - seems a lot faster on Intel with gcc -#ifndef NDEBUG - // Some debug so check - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinMemcpyN", ""); - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinMemcpyN", ""); -#endif -#endif - std::memcpy(to,from,size*sizeof(T)); -#else - if (size == 0 || from == to) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to copy negative number of entries", - "CoinMemcpyN", ""); -#endif - -#if 0 - /* There is no point to do this test. If to and from are from different - blocks then dist is undefined, so this can crash correct code. It's - better to trust the user that the arrays are really disjoint. */ - const long dist = to - from; - if (-size < dist && dist < size) - throw CoinError("overlapping arrays", "CoinMemcpyN", ""); -#endif - - for (register int n = size / 8; n > 0; --n, from += 8, to += 8) { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to[4] = from[4]; - to[5] = from[5]; - to[6] = from[6]; - to[7] = from[7]; - } - switch (size % 8) { - case 7: to[6] = from[6]; - case 6: to[5] = from[5]; - case 5: to[4] = from[4]; - case 4: to[3] = from[3]; - case 3: to[2] = from[2]; - case 2: to[1] = from[1]; - case 1: to[0] = from[0]; - case 0: break; - } -#endif -#else - CoinCopyN(from, size, to); -#endif -} -#else -template <class T> inline void -CoinMemcpyN(const T * COIN_RESTRICT from, int size, T* COIN_RESTRICT to) -{ -#ifdef USE_MEMCPY - std::memcpy(to,from,size*sizeof(T)); -#else - T * COIN_RESTRICT put = to; - const T * COIN_RESTRICT get = from; - for ( ; 0<size ; --size) - *put++ = *get++; -#endif -} -#endif - -//----------------------------------------------------------------------------- - -/** This helper function copies an array to another location. The two arrays - must not overlap (otherwise an exception is thrown). For speed 8 entries - are copied at a time. The source array is given by its first and "after - last" entry; the target array is given by its first entry. */ -template <class T> inline void -CoinMemcpy(register const T* first, register const T* last, - register T* to) -{ - CoinMemcpyN(first, static_cast<int>(last - first), to); -} - -//############################################################################# - -/** This helper function fills an array with a given value. For speed 8 entries - are filled at a time. The array is given by a pointer to its first entry - and its size. - - Note JJF - the speed claim seems to be false on IA32 so I have added - CoinZero to allow for memset. */ -template <class T> inline void -CoinFillN(register T* to, const int size, register const T value) -{ - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinFillN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, to += 8) { - to[0] = value; - to[1] = value; - to[2] = value; - to[3] = value; - to[4] = value; - to[5] = value; - to[6] = value; - to[7] = value; - } - switch (size % 8) { - case 7: to[6] = value; - case 6: to[5] = value; - case 5: to[4] = value; - case 4: to[3] = value; - case 3: to[2] = value; - case 2: to[1] = value; - case 1: to[0] = value; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --to; - switch (size % 8) { - case 0: do{ *++to = value; - case 7: *++to = value; - case 6: *++to = value; - case 5: *++to = value; - case 4: *++to = value; - case 3: *++to = value; - case 2: *++to = value; - case 1: *++to = value; - }while(--n>0); - } -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function fills an array with a given value. For speed 8 - entries are filled at a time. The array is given by its first and "after - last" entry. */ -template <class T> inline void -CoinFill(register T* first, register T* last, const T value) -{ - CoinFillN(first, last - first, value); -} - -//############################################################################# - -/** This helper function fills an array with zero. For speed 8 entries - are filled at a time. The array is given by a pointer to its first entry - and its size. - - Note JJF - the speed claim seems to be false on IA32 so I have allowed - for memset as an alternative */ -template <class T> inline void -CoinZeroN(register T* to, const int size) -{ -#ifdef USE_MEMCPY - // Use memset - seems faster on Intel with gcc -#ifndef NDEBUG - // Some debug so check - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinZeroN", ""); -#endif - memset(to,0,size*sizeof(T)); -#else - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("trying to fill negative number of entries", - "CoinZeroN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, to += 8) { - to[0] = 0; - to[1] = 0; - to[2] = 0; - to[3] = 0; - to[4] = 0; - to[5] = 0; - to[6] = 0; - to[7] = 0; - } - switch (size % 8) { - case 7: to[6] = 0; - case 6: to[5] = 0; - case 5: to[4] = 0; - case 4: to[3] = 0; - case 3: to[2] = 0; - case 2: to[1] = 0; - case 1: to[0] = 0; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --to; - switch (size % 8) { - case 0: do{ *++to = 0; - case 7: *++to = 0; - case 6: *++to = 0; - case 5: *++to = 0; - case 4: *++to = 0; - case 3: *++to = 0; - case 2: *++to = 0; - case 1: *++to = 0; - }while(--n>0); - } -#endif -#endif -} -/// This Debug helper function checks an array is all zero -inline void -CoinCheckDoubleZero(double * to, const int size) -{ - int n=0; - for (int j=0;j<size;j++) { - if (to[j]) - n++; - } - if (n) { - printf("array of length %d should be zero has %d nonzero\n",size,n); - } -} -/// This Debug helper function checks an array is all zero -inline void -CoinCheckIntZero(int * to, const int size) -{ - int n=0; - for (int j=0;j<size;j++) { - if (to[j]) - n++; - } - if (n) { - printf("array of length %d should be zero has %d nonzero\n",size,n); - } -} - -//----------------------------------------------------------------------------- - -/** This helper function fills an array with a given value. For speed 8 - entries are filled at a time. The array is given by its first and "after - last" entry. */ -template <class T> inline void -CoinZero(register T* first, register T* last) -{ - CoinZeroN(first, last - first); -} - -//############################################################################# - -/** Returns strdup or NULL if original NULL */ -inline char * CoinStrdup(const char * name) -{ - char* dup = NULL; - if (name) { - const int len = static_cast<int>(strlen(name)); - dup = static_cast<char*>(malloc(len+1)); - CoinMemcpyN(name, len, dup); - dup[len] = 0; - } - return dup; -} - -//############################################################################# - -/** Return the larger (according to <code>operator<()</code> of the arguments. - This function was introduced because for some reason compiler tend to - handle the <code>max()</code> function differently. */ -template <class T> inline T -CoinMax(register const T x1, register const T x2) -{ - return (x1 > x2) ? x1 : x2; -} - -//----------------------------------------------------------------------------- - -/** Return the smaller (according to <code>operator<()</code> of the arguments. - This function was introduced because for some reason compiler tend to - handle the min() function differently. */ -template <class T> inline T -CoinMin(register const T x1, register const T x2) -{ - return (x1 < x2) ? x1 : x2; -} - -//----------------------------------------------------------------------------- - -/** Return the absolute value of the argument. This function was introduced - because for some reason compiler tend to handle the abs() function - differently. */ -template <class T> inline T -CoinAbs(const T value) -{ - return value<0 ? -value : value; -} - -//############################################################################# - -/** This helper function tests whether the entries of an array are sorted - according to operator<. The array is given by a pointer to its first entry - and by its size. */ -template <class T> inline bool -CoinIsSorted(register const T* first, const int size) -{ - if (size == 0) - return true; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("negative number of entries", "CoinIsSorted", ""); -#endif -#if 1 - // size1 is the number of comparisons to be made - const int size1 = size - 1; - for (register int n = size1 / 8; n > 0; --n, first += 8) { - if (first[8] < first[7]) return false; - if (first[7] < first[6]) return false; - if (first[6] < first[5]) return false; - if (first[5] < first[4]) return false; - if (first[4] < first[3]) return false; - if (first[3] < first[2]) return false; - if (first[2] < first[1]) return false; - if (first[1] < first[0]) return false; - } - - switch (size1 % 8) { - case 7: if (first[7] < first[6]) return false; - case 6: if (first[6] < first[5]) return false; - case 5: if (first[5] < first[4]) return false; - case 4: if (first[4] < first[3]) return false; - case 3: if (first[3] < first[2]) return false; - case 2: if (first[2] < first[1]) return false; - case 1: if (first[1] < first[0]) return false; - case 0: break; - } -#else - register const T* next = first; - register const T* last = first + size; - for (++next; next != last; first = next, ++next) - if (*next < *first) - return false; -#endif - return true; -} - -//----------------------------------------------------------------------------- - -/** This helper function tests whether the entries of an array are sorted - according to operator<. The array is given by its first and "after - last" entry. */ -template <class T> inline bool -CoinIsSorted(register const T* first, register const T* last) -{ - return CoinIsSorted(first, static_cast<int>(last - first)); -} - -//############################################################################# - -/** This helper function fills an array with the values init, init+1, init+2, - etc. For speed 8 entries are filled at a time. The array is given by a - pointer to its first entry and its size. */ -template <class T> inline void -CoinIotaN(register T* first, const int size, register T init) -{ - if (size == 0) - return; - -#ifndef NDEBUG - if (size < 0) - throw CoinError("negative number of entries", "CoinIotaN", ""); -#endif -#if 1 - for (register int n = size / 8; n > 0; --n, first += 8, init += 8) { - first[0] = init; - first[1] = init + 1; - first[2] = init + 2; - first[3] = init + 3; - first[4] = init + 4; - first[5] = init + 5; - first[6] = init + 6; - first[7] = init + 7; - } - switch (size % 8) { - case 7: first[6] = init + 6; - case 6: first[5] = init + 5; - case 5: first[4] = init + 4; - case 4: first[3] = init + 3; - case 3: first[2] = init + 2; - case 2: first[1] = init + 1; - case 1: first[0] = init; - case 0: break; - } -#else - // Use Duff's device to fill - register int n = (size + 7) / 8; - --first; - --init; - switch (size % 8) { - case 0: do{ *++first = ++init; - case 7: *++first = ++init; - case 6: *++first = ++init; - case 5: *++first = ++init; - case 4: *++first = ++init; - case 3: *++first = ++init; - case 2: *++first = ++init; - case 1: *++first = ++init; - }while(--n>0); - } -#endif -} - -//----------------------------------------------------------------------------- - -/** This helper function fills an array with the values init, init+1, init+2, - etc. For speed 8 entries are filled at a time. The array is given by its - first and "after last" entry. */ -template <class T> inline void -CoinIota(T* first, const T* last, T init) -{ - CoinIotaN(first, last-first, init); -} - -//############################################################################# - -/** This helper function deletes certain entries from an array. The array is - given by pointers to its first and "after last" entry (first two - arguments). The positions of the entries to be deleted are given in the - integer array specified by the last two arguments (again, first and "after - last" entry). */ -template <class T> inline T * -CoinDeleteEntriesFromArray(register T * arrayFirst, register T * arrayLast, - const int * firstDelPos, const int * lastDelPos) -{ - int delNum = static_cast<int>(lastDelPos - firstDelPos); - if (delNum == 0) - return arrayLast; - - if (delNum < 0) - throw CoinError("trying to delete negative number of entries", - "CoinDeleteEntriesFromArray", ""); - - int * delSortedPos = NULL; - if (! (CoinIsSorted(firstDelPos, lastDelPos) && - std::adjacent_find(firstDelPos, lastDelPos) == lastDelPos)) { - // the positions of the to be deleted is either not sorted or not unique - delSortedPos = new int[delNum]; - CoinDisjointCopy(firstDelPos, lastDelPos, delSortedPos); - std::sort(delSortedPos, delSortedPos + delNum); - delNum = static_cast<int>(std::unique(delSortedPos, - delSortedPos+delNum) - delSortedPos); - } - const int * delSorted = delSortedPos ? delSortedPos : firstDelPos; - - const int last = delNum - 1; - int size = delSorted[0]; - for (int i = 0; i < last; ++i) { - const int copyFirst = delSorted[i] + 1; - const int copyLast = delSorted[i+1]; - CoinCopy(arrayFirst + copyFirst, arrayFirst + copyLast, - arrayFirst + size); - size += copyLast - copyFirst; - } - const int copyFirst = delSorted[last] + 1; - const int copyLast = static_cast<int>(arrayLast - arrayFirst); - CoinCopy(arrayFirst + copyFirst, arrayFirst + copyLast, - arrayFirst + size); - size += copyLast - copyFirst; - - if (delSortedPos) - delete[] delSortedPos; - - return arrayFirst + size; -} - -//############################################################################# - -#define COIN_OWN_RANDOM_32 - -#if defined COIN_OWN_RANDOM_32 -/* Thanks to Stefano Gliozzi for providing an operating system - independent random number generator. */ - -/*! \brief Return a random number between 0 and 1 - - A platform-independent linear congruential generator. For a given seed, the - generated sequence is always the same regardless of the (32-bit) - architecture. This allows to build & test in different environments, getting - in most cases the same optimization path. - - Set \p isSeed to true and supply an integer seed to set the seed - (vid. #CoinSeedRandom) - - \todo Anyone want to volunteer an upgrade for 64-bit architectures? -*/ -inline double CoinDrand48 (bool isSeed = false, unsigned int seed = 1) -{ - static unsigned int last = 123456; - if (isSeed) { - last = seed; - } else { - last = 1664525*last+1013904223; - return ((static_cast<double> (last))/4294967296.0); - } - return (0.0); -} - -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) -{ - CoinDrand48(true, iseed); -} - -#else // COIN_OWN_RANDOM_32 - -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN32__) - -/// Return a random number between 0 and 1 -inline double CoinDrand48() { return rand() / (double) RAND_MAX; } -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) { srand(iseed + 69822); } - -#else - -/// Return a random number between 0 and 1 -inline double CoinDrand48() { return drand48(); } -/// Set the seed for the random number generator -inline void CoinSeedRandom(int iseed) { srand48(iseed + 69822); } - -#endif - -#endif // COIN_OWN_RANDOM_32 - -//############################################################################# - -/** This function figures out whether file names should contain slashes or - backslashes as directory separator */ -inline char CoinFindDirSeparator() -{ - int size = 1000; - char* buf = 0; - while (true) { - buf = new char[size]; - if (getcwd(buf, size)) - break; - delete[] buf; - buf = 0; - size = 2*size; - } - // if first char is '/' then it's unix and the dirsep is '/'. otherwise we - // assume it's dos and the dirsep is '\' - char dirsep = buf[0] == '/' ? '/' : '\\'; - delete[] buf; - return dirsep; -} -//############################################################################# - -inline int CoinStrNCaseCmp(const char* s0, const char* s1, - const size_t len) -{ - for (size_t i = 0; i < len; ++i) { - if (s0[i] == 0) { - return s1[i] == 0 ? 0 : -1; - } - if (s1[i] == 0) { - return 1; - } - const int c0 = std::tolower(s0[i]); - const int c1 = std::tolower(s1[i]); - if (c0 < c1) - return -1; - if (c0 > c1) - return 1; - } - return 0; -} - -//############################################################################# - -/// Swap the arguments. -template <class T> inline void CoinSwap (T &x, T &y) -{ - T t = x; - x = y; - y = t; -} - -//############################################################################# - -/** This helper function copies an array to file - Returns 0 if OK, 1 if bad write. -*/ - -template <class T> inline int -CoinToFile( const T* array, CoinBigIndex size, FILE * fp) -{ - CoinBigIndex numberWritten; - if (array&&size) { - numberWritten = - static_cast<CoinBigIndex>(fwrite(&size,sizeof(int),1,fp)); - if (numberWritten!=1) - return 1; - numberWritten = - static_cast<CoinBigIndex>(fwrite(array,sizeof(T),size_t(size),fp)); - if (numberWritten!=size) - return 1; - } else { - size = 0; - numberWritten = - static_cast<CoinBigIndex>(fwrite(&size,sizeof(int),1,fp)); - if (numberWritten!=1) - return 1; - } - return 0; -} - -//############################################################################# - -/** This helper function copies an array from file and creates with new. - Passed in array is ignored i.e. not deleted. - But if NULL and size does not match and newSize 0 then leaves as NULL and 0 - Returns 0 if OK, 1 if bad read, 2 if size did not match. -*/ - -template <class T> inline int -CoinFromFile( T* &array, CoinBigIndex size, FILE * fp, CoinBigIndex & newSize) -{ - CoinBigIndex numberRead; - numberRead = - static_cast<CoinBigIndex>(fread(&newSize,sizeof(int),1,fp)); - if (numberRead!=1) - return 1; - int returnCode=0; - if (size!=newSize&&(newSize||array)) - returnCode=2; - if (newSize) { - array = new T [newSize]; - numberRead = - static_cast<CoinBigIndex>(fread(array,sizeof(T),newSize,fp)); - if (numberRead!=newSize) - returnCode=1; - } else { - array = NULL; - } - return returnCode; -} - -//############################################################################# - -/// Cube Root -#if 0 -inline double CoinCbrt(double x) -{ -#if defined(_MSC_VER) - return pow(x,(1./3.)); -#else - return cbrt(x); -#endif -} -#endif - -//----------------------------------------------------------------------------- - -/// This helper returns "sizeof" as an int -#define CoinSizeofAsInt(type) (static_cast<int>(sizeof(type))) -/// This helper returns "strlen" as an int -inline int -CoinStrlenAsInt(const char * string) -{ - return static_cast<int>(strlen(string)); -} - -/** Class for thread specific random numbers -*/ -#if defined COIN_OWN_RANDOM_32 -class CoinThreadRandom { -public: - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - CoinThreadRandom() - { seed_=12345678;} - /** Constructor wih seed. */ - CoinThreadRandom(int seed) - { - seed_ = seed; - } - /** Destructor */ - ~CoinThreadRandom() {} - // Copy - CoinThreadRandom(const CoinThreadRandom & rhs) - { seed_ = rhs.seed_;} - // Assignment - CoinThreadRandom& operator=(const CoinThreadRandom & rhs) - { - if (this != &rhs) { - seed_ = rhs.seed_; - } - return *this; - } - - //@} - - /**@name Sets/gets */ - - //@{ - /** Set seed. */ - inline void setSeed(int seed) - { - seed_ = seed; - } - /** Get seed. */ - inline unsigned int getSeed() const - { - return seed_; - } - /// return a random number - inline double randomDouble() const - { - double retVal; - seed_ = 1664525*(seed_)+1013904223; - retVal = ((static_cast<double> (seed_))/4294967296.0); - return retVal; - } - /// make more random (i.e. for startup) - inline void randomize(int n=0) - { - if (!n) - n=seed_ & 255; - for (int i=0;i<n;i++) - randomDouble(); - } - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Current seed - mutable unsigned int seed_; - //@} -}; -#else -class CoinThreadRandom { -public: - /**@name Constructors, destructor */ - - //@{ - /** Default constructor. */ - CoinThreadRandom() - { seed_[0]=50000;seed_[1]=40000;seed_[2]=30000;} - /** Constructor wih seed. */ - CoinThreadRandom(const unsigned short seed[3]) - { memcpy(seed_,seed,3*sizeof(unsigned short));} - /** Constructor wih seed. */ - CoinThreadRandom(int seed) - { - union { int i[2]; unsigned short int s[4];} put; - put.i[0]=seed; - put.i[1]=seed; - memcpy(seed_,put.s,3*sizeof(unsigned short)); - } - /** Destructor */ - ~CoinThreadRandom() {} - // Copy - CoinThreadRandom(const CoinThreadRandom & rhs) - { memcpy(seed_,rhs.seed_,3*sizeof(unsigned short));} - // Assignment - CoinThreadRandom& operator=(const CoinThreadRandom & rhs) - { - if (this != &rhs) { - memcpy(seed_,rhs.seed_,3*sizeof(unsigned short)); - } - return *this; - } - - //@} - - /**@name Sets/gets */ - - //@{ - /** Set seed. */ - inline void setSeed(const unsigned short seed[3]) - { memcpy(seed_,seed,3*sizeof(unsigned short));} - /** Set seed. */ - inline void setSeed(int seed) - { - union { int i[2]; unsigned short int s[4];} put; - put.i[0]=seed; - put.i[1]=seed; - memcpy(seed_,put.s,3*sizeof(unsigned short)); - } - /// return a random number - inline double randomDouble() const - { - double retVal; -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN32__) - retVal=rand(); - retVal=retVal/(double) RAND_MAX; -#else - retVal = erand48(seed_); -#endif - return retVal; - } - /// make more random (i.e. for startup) - inline void randomize(int n=0) - { - if (!n) { - n=seed_[0]+seed_[1]+seed_[2]; - n &= 255; - } - for (int i=0;i<n;i++) - randomDouble(); - } - //@} - - -protected: - /**@name Data members - The data members are protected to allow access for derived classes. */ - //@{ - /// Current seed - mutable unsigned short seed_[3]; - //@} -}; -#endif -#ifndef COIN_DETAIL -#define COIN_DETAIL_PRINT(s) {} -#else -#define COIN_DETAIL_PRINT(s) s -#endif -#endif |