Rev 15347 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev | Author | Line No. | Line |
---|---|---|---|

12065 | fschmid | 1 | `#ifndef LIB2GEOM_UTILS_HEADER` |

2 | `#define LIB2GEOM_UTILS_HEADER` |
||

3 | |||

15347 | fschmid | 4 | `/** Various utility functions.` |

12065 | fschmid | 5 | ` *` |

6 | ` * Copyright 2007 Johan Engelen <goejendaagh@zonnet.nl>` |
||

7 | ` * Copyright 2006 Michael G. Sloan <mgsloan@gmail.com>` |
||

8 | ` *` |
||

9 | ` * This library is free software; you can redistribute it and/or` |
||

10 | ` * modify it either under the terms of the GNU Lesser General Public` |
||

11 | ` * License version 2.1 as published by the Free Software Foundation` |
||

12 | ` * (the "LGPL") or, at your option, under the terms of the Mozilla` |
||

13 | ` * Public License Version 1.1 (the "MPL"). If you do not alter this` |
||

14 | ` * notice, a recipient may use your version of this file under either` |
||

15 | ` * the MPL or the LGPL.` |
||

16 | ` *` |
||

17 | ` * You should have received a copy of the LGPL along with this library` |
||

18 | ` * in the file COPYING-LGPL-2.1; if not, write to the Free Software` |
||

18122 | mrdocs | 19 | ` * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA` |

12065 | fschmid | 20 | ` * You should have received a copy of the MPL along with this library` |

21 | ` * in the file COPYING-MPL-1.1` |
||

22 | ` *` |
||

23 | ` * The contents of this file are subject to the Mozilla Public License` |
||

24 | ` * Version 1.1 (the "License"); you may not use this file except in` |
||

25 | ` * compliance with the License. You may obtain a copy of the License at` |
||

26 | ` * http://www.mozilla.org/MPL/` |
||

27 | ` *` |
||

28 | ` * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY` |
||

29 | ` * OF ANY KIND, either express or implied. See the LGPL or the MPL for` |
||

30 | ` * the specific language governing rights and limitations.` |
||

31 | ` *` |
||

32 | ` */` |
||

33 | |||

15347 | fschmid | 34 | `#include <cmath>` |

12065 | fschmid | 35 | |

36 | namespace Geom { |
||

37 | |||

38 | `// proper logical xor` |
||

39 | inline bool logical_xor (bool a, bool b) { return (a || b) && !(a && b); } |
||

40 | |||

15347 | fschmid | 41 | `/** Sign function - indicates the sign of a numeric type. -1 indicates negative, 1 indicates` |

42 | ` * positive, and 0 indicates, well, 0. Mathsy people will know this is basically the derivative` |
||

43 | ` * of abs, except for the fact that it is defined on 0.` |
||

44 | ` */` |
||

45 | template <class T> inline int sgn(const T& x) {return (x < 0 ? -1 : (x > 0 ? 1 : 0) );} |
||

12065 | fschmid | 46 | |

15347 | fschmid | 47 | template <class T> inline T sqr(const T& x) {return x * x;} |

48 | template <class T> inline T cube(const T& x) {return x * x * x;} |
||

49 | |||

50 | `/** Between function - returns true if a number x is within a range. The values delimiting the` |
||

51 | ` * range and the number must have the same type.` |
||

52 | ` */` |
||

53 | template <class T> inline const T& between (const T& min, const T& max, const T& x) |
||

54 | { return min < x && max > x; } |
||

55 | |||

56 | `/** Returns x rounded to the nearest integer. It is unspecified what happens` |
||

57 | ` * if x is half way between two integers: we may in future use rint/round` |
||

58 | ` * on platforms that have them.` |
||

59 | ` */` |
||

60 | inline double round(double const x) { return std::floor(x + .5); } |
||

61 | |||

62 | `/** Returns x rounded to the nearest \a places decimal places.` |
||

63 | |||

64 | ` Implemented in terms of round, i.e. we make no guarantees as to what happens if x is` |
||

65 | ` half way between two rounded numbers.` |
||

66 | |||

67 | ` Note: places is the number of decimal places without using scientific (e) notation, not the` |
||

68 | ` number of significant figures. This function may not be suitable for values of x whose` |
||

69 | ` magnitude is so far from 1 that one would want to use scientific (e) notation.` |
||

70 | |||

71 | ` places may be negative: e.g. places = -2 means rounding to a multiple of .01` |
||

72 | `**/` |
||

73 | inline double decimal_round(double const x, int const places) { |
||

74 | ` //TODO: possibly implement with modulus instead?` |
||

75 | double const multiplier = std::pow(10.0, places); |
||

76 | return round( x * multiplier ) / multiplier; |
||

12065 | fschmid | 77 | `}` |

78 | |||

15347 | fschmid | 79 | `}` |

80 | |||

15344 | fschmid | 81 | `#endif` |