QCAD
Open Source 2D CAD
Loading...
Searching...
No Matches
Tools.h
Go to the documentation of this file.
1/******************************************************************************
2 * Project: libspatialindex - A C++ library for spatial indexing
3 * Author: Marios Hadjieleftheriou, [email protected]
4 ******************************************************************************
5 * Copyright (c) 2004, Marios Hadjieleftheriou
6 *
7 * All rights reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26******************************************************************************/
27
28#pragma once
29
30
31#if (defined _WIN32 || defined _WIN64 || defined WIN32 || defined WIN64) && !defined __GNUC__ && _MSC_VER<1900 && _MSC_VER!=1800 && _MSC_VER!=1600
32 typedef __int8 int8_t;
33 typedef __int16 int16_t;
34 typedef __int32 int32_t;
35 typedef __int64 int64_t;
36 typedef unsigned __int8 uint8_t;
37 typedef unsigned __int16 uint16_t;
38 typedef unsigned __int32 uint32_t;
39 typedef unsigned __int64 uint64_t;
40
41// Nuke this annoying warning. See http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html
42#pragma warning( disable: 4251 )
43
44#else
45 #include <stdint.h>
46#endif
47
48#if (defined _WIN32 || defined _WIN64 || defined WIN32 || defined WIN64) && !defined __GNUC__
49 #ifdef SPATIALINDEX_CREATE_DLL
50 #define SIDX_DLL __declspec(dllexport)
51 #else
52 #define SIDX_DLL __declspec(dllimport)
53 #endif
54#else
55 #define SIDX_DLL
56#endif
57
58#include <assert.h>
59#include <iostream>
60#include <iomanip>
61#include <iterator>
62#include <string>
63#include <sstream>
64#include <fstream>
65#include <queue>
66#include <vector>
67#include <map>
68#include <set>
69#include <stack>
70#include <list>
71#include <algorithm>
72#include <cwchar>
73
74#if HAVE_PTHREAD_H
75 #include <pthread.h>
76#endif
77
78#include "SmartPointer.h"
79#include "PointerPool.h"
80#include "PoolPointer.h"
81
82typedef uint8_t byte;
83
84namespace Tools
85{
93
114
116 {
117 APPEND = 0x0,
118 CREATE
119 };
120
121 //
122 // Exceptions
123 //
125 {
126 public:
127 virtual std::string what() = 0;
128 virtual ~Exception() {}
129 };
130
132 {
133 public:
136 virtual std::string what();
137
138 private:
139 std::string m_error;
140 }; // IndexOutOfBoundsException
141
143 {
144 public:
147 virtual std::string what();
148
149 private:
150 std::string m_error;
151 }; // IllegalArgumentException
152
154 {
155 public:
158 virtual std::string what();
159
160 private:
161 std::string m_error;
162 }; // IllegalStateException
163
165 {
166 public:
169 virtual std::string what();
170
171 private:
172 std::string m_error;
173 }; // EndOfStreamException
174
176 {
177 public:
180 virtual std::string what();
181
182 private:
183 std::string m_error;
184 }; // ResourceLockedException
185
187 {
188 public:
191 virtual std::string what();
192
193 private:
194 std::string m_error;
195 }; // NotSupportedException
196
197 //
198 // Interfaces
199 //
201 {
202 public:
203 virtual ~IInterval() {}
204
205 virtual double getLowerBound() const = 0;
206 virtual double getUpperBound() const = 0;
207 virtual void setBounds(double, double) = 0;
208 virtual bool intersectsInterval(const IInterval&) const = 0;
209 virtual bool intersectsInterval(IntervalType type, const double start, const double end) const = 0;
210 virtual bool containsInterval(const IInterval&) const = 0;
211 virtual IntervalType getIntervalType() const = 0;
212 }; // IInterval
213
215 {
216 public:
217 virtual ~IObject() {}
218
219 virtual IObject* clone() = 0;
220 // return a new object that is an exact copy of this one.
221 // IMPORTANT: do not return the this pointer!
222 }; // IObject
223
225 {
226 public:
227 virtual ~ISerializable() {}
228
229 virtual uint32_t getByteArraySize() = 0;
230 // returns the size of the required byte array.
231 virtual void loadFromByteArray(const byte* data) = 0;
232 // load this object using the byte array.
233 virtual void storeToByteArray(byte** data, uint32_t& length) = 0;
234 // store this object in the byte array.
235 };
236
238 {
239 public:
240 virtual ~IComparable() {}
241
242 virtual bool operator<(const IComparable& o) const = 0;
243 virtual bool operator>(const IComparable& o) const = 0;
244 virtual bool operator==(const IComparable& o) const = 0;
245 }; //IComparable
246
248 {
249 public:
251
252 virtual int compare(IObject* o1, IObject* o2) = 0;
253 }; // IObjectComparator
254
256 {
257 public:
258 virtual ~IObjectStream() {}
259
260 virtual IObject* getNext() = 0;
261 // returns a pointer to the next entry in the
262 // stream or 0 at the end of the stream.
263
264 virtual bool hasNext() = 0;
265 // returns true if there are more items in the stream.
266
267 virtual uint32_t size() = 0;
268 // returns the total number of entries available in the stream.
269
270 virtual void rewind() = 0;
271 // sets the stream pointer to the first entry, if possible.
272 }; // IObjectStream
273
274 //
275 // Classes & Functions
276 //
277
279 {
280 public:
282
284
285 union
286 {
287 int16_t iVal; // VT_SHORT
288 int32_t lVal; // VT_LONG
289 int64_t llVal; // VT_LONGLONG
290 byte bVal; // VT_BYTE
291 float fltVal; // VT_FLOAT
292 double dblVal; // VT_DOUBLE
293 char cVal; // VT_CHAR
294 uint16_t uiVal; // VT_USHORT
295 uint32_t ulVal; // VT_ULONG
296 uint64_t ullVal; // VT_ULONGLONG
297 bool blVal; // VT_BOOL
298 char* pcVal; // VT_PCHAR
299 void* pvVal; // VT_PVOID
300 wchar_t* pwcVal;
301 } m_val;
302 }; // Variant
303
305 SIDX_DLL std::ostream& operator<<(std::ostream& os, const Tools::PropertySet& p);
306
308 {
309 public:
311 PropertySet(const byte* data);
312 virtual ~PropertySet();
313
314 Variant getProperty(std::string property) const;
315 void setProperty(std::string property, Variant const& v);
316 void removeProperty(std::string property);
317
318 virtual uint32_t getByteArraySize();
319 virtual void loadFromByteArray(const byte* data);
320 virtual void storeToByteArray(byte** data, uint32_t& length);
321
322 private:
323 std::map<std::string, Variant> m_propertySet;
324// #ifdef HAVE_PTHREAD_H
325// pthread_rwlock_t m_rwLock;
326// #else
327// bool m_rwLock;
328// #endif
329 friend SIDX_DLL std::ostream& Tools::operator<<(std::ostream& os, const Tools::PropertySet& p);
330 }; // PropertySet
331
332 // does not support degenerate intervals.
334 {
335 public:
337 Interval(IntervalType, double, double);
338 Interval(double, double);
340 virtual ~Interval() {}
341 virtual IInterval& operator=(const IInterval&);
342
343 virtual bool operator==(const Interval&) const;
344 virtual bool operator!=(const Interval&) const;
345 virtual double getLowerBound() const;
346 virtual double getUpperBound() const;
347 virtual void setBounds(double, double);
348 virtual bool intersectsInterval(const IInterval&) const;
349 virtual bool intersectsInterval(IntervalType type, const double start, const double end) const;
350 virtual bool containsInterval(const IInterval&) const;
352
354 double m_low;
355 double m_high;
356 }; // Interval
357
358 SIDX_DLL std::ostream& operator<<(std::ostream& os, const Tools::Interval& iv);
359
361 {
362 public:
364 Random(uint32_t seed, uint16_t xsubi0);
365 virtual ~Random();
366
368 // returns a uniformly distributed long.
370 // returns a uniformly distributed unsigned long.
371 int32_t nextUniformLong(int32_t low, int32_t high);
372 // returns a uniformly distributed long in the range [low, high).
373 uint32_t nextUniformUnsignedLong(uint32_t low, uint32_t high);
374 // returns a uniformly distributed unsigned long in the range [low, high).
376 // returns a uniformly distributed long long.
378 // returns a uniformly distributed unsigned long long.
379 int64_t nextUniformLongLong(int64_t low, int64_t high);
380 // returns a uniformly distributed unsigned long long in the range [low, high).
381 uint64_t nextUniformUnsignedLongLong(uint64_t low, uint64_t high);
382 // returns a uniformly distributed unsigned long long in the range [low, high).
384 // returns a uniformly distributed short.
386 // returns a uniformly distributed unsigned short.
388 // returns a uniformly distributed double in the range [0, 1).
389 double nextUniformDouble(double low, double high);
390 // returns a uniformly distributed double in the range [low, high).
391
392 bool flipCoin();
393
394 private:
395 void initDrand(uint32_t seed, uint16_t xsubi0);
396
397 uint16_t* m_pBuffer;
398 }; // Random
399
400 #if HAVE_PTHREAD_H
401 class SIDX_DLL LockGuard
402 {
403 public:
404 LockGuard(pthread_mutex_t* pLock);
405 ~LockGuard();
406
407 private:
408 pthread_mutex_t* m_pLock;
409 }; // LockGuard
410 #endif
411
413 {
414 public:
415 BufferedFile(uint32_t u32BufferSize = 16384);
416 virtual ~BufferedFile();
417
418 virtual void close();
419 virtual bool eof();
420 virtual void rewind() = 0;
421 virtual void seek(std::fstream::off_type offset) = 0;
422
423 protected:
424 std::fstream m_file;
425 char* m_buffer;
427 bool m_bEOF;
428 };
429
431 {
432 public:
434 BufferedFileReader(const std::string& sFileName, uint32_t u32BufferSize = 32768);
436
437 virtual void open(const std::string& sFileName);
438 virtual void rewind();
439 virtual void seek(std::fstream::off_type offset);
440
441 virtual uint8_t readUInt8();
442 virtual uint16_t readUInt16();
443 virtual uint32_t readUInt32();
444 virtual uint64_t readUInt64();
445 virtual float readFloat();
446 virtual double readDouble();
447 virtual bool readBoolean();
448 virtual std::string readString();
449 virtual void readBytes(uint32_t u32Len, byte** pData);
450 };
451
453 {
454 public:
456 BufferedFileWriter(const std::string& sFileName, FileMode mode = CREATE, uint32_t u32BufferSize = 32768);
458
459 virtual void open(const std::string& sFileName, FileMode mode = CREATE);
460 virtual void rewind();
461 virtual void seek(std::fstream::off_type offset);
462
463 virtual void write(uint8_t i);
464 virtual void write(uint16_t i);
465 virtual void write(uint32_t i);
466 virtual void write(uint64_t i);
467 virtual void write(float i);
468 virtual void write(double i);
469 virtual void write(bool b);
470 virtual void write(const std::string& s);
471 virtual void write(uint32_t u32Len, byte* pData);
472 };
473
475 {
476 public:
478 virtual ~TemporaryFile();
479
482 bool eof();
483 std::string getFileName() const;
484
485 uint8_t readUInt8();
486 uint16_t readUInt16();
487 uint32_t readUInt32();
488 uint64_t readUInt64();
489 float readFloat();
490 double readDouble();
491 std::string readString();
492 void readBytes(uint32_t u32Len, byte** pData);
493
494 void write(uint8_t i);
495 void write(uint16_t i);
496 void write(uint32_t i);
497 void write(uint64_t i);
498 void write(float i);
499 void write(double i);
500 void write(const std::string& s);
501 void write(uint32_t u32Len, byte* pData);
502
503 private:
504 std::string m_sFile;
506 };
507}
uint8_t byte
Definition Tools.h:82
int i
Copyright (c) 2011-2018 by Andrew Mustun.
Definition autostart.js:32
Definition Tools.h:413
virtual void seek(std::fstream::off_type offset)=0
virtual bool eof()
std::fstream m_file
Definition Tools.h:424
char * m_buffer
Definition Tools.h:425
BufferedFile(uint32_t u32BufferSize=16384)
uint32_t m_u32BufferSize
Definition Tools.h:426
virtual ~BufferedFile()
bool m_bEOF
Definition Tools.h:427
virtual void close()
virtual void rewind()=0
Definition Tools.h:431
virtual bool readBoolean()
virtual uint8_t readUInt8()
virtual double readDouble()
virtual uint16_t readUInt16()
virtual float readFloat()
BufferedFileReader(const std::string &sFileName, uint32_t u32BufferSize=32768)
virtual uint64_t readUInt64()
virtual void open(const std::string &sFileName)
virtual void seek(std::fstream::off_type offset)
virtual uint32_t readUInt32()
virtual std::string readString()
virtual void readBytes(uint32_t u32Len, byte **pData)
Definition Tools.h:453
virtual void write(uint32_t i)
virtual void write(uint8_t i)
virtual void write(double i)
virtual void open(const std::string &sFileName, FileMode mode=CREATE)
virtual void write(uint64_t i)
virtual void write(uint32_t u32Len, byte *pData)
BufferedFileWriter(const std::string &sFileName, FileMode mode=CREATE, uint32_t u32BufferSize=32768)
virtual void write(float i)
virtual void seek(std::fstream::off_type offset)
virtual void write(bool b)
virtual void write(uint16_t i)
virtual void write(const std::string &s)
Definition Tools.h:165
std::string m_error
Definition Tools.h:172
virtual std::string what()
virtual ~EndOfStreamException()
Definition Tools.h:168
EndOfStreamException(std::string s)
Definition Tools.h:125
virtual std::string what()=0
virtual ~Exception()
Definition Tools.h:128
Definition Tools.h:238
virtual ~IComparable()
Definition Tools.h:240
virtual bool operator<(const IComparable &o) const =0
virtual bool operator==(const IComparable &o) const =0
virtual bool operator>(const IComparable &o) const =0
Definition Tools.h:201
virtual void setBounds(double, double)=0
virtual bool containsInterval(const IInterval &) const =0
virtual bool intersectsInterval(IntervalType type, const double start, const double end) const =0
virtual ~IInterval()
Definition Tools.h:203
virtual double getLowerBound() const =0
virtual double getUpperBound() const =0
virtual bool intersectsInterval(const IInterval &) const =0
virtual IntervalType getIntervalType() const =0
Definition Tools.h:248
virtual int compare(IObject *o1, IObject *o2)=0
virtual ~IObjectComparator()
Definition Tools.h:250
Definition Tools.h:215
virtual IObject * clone()=0
virtual ~IObject()
Definition Tools.h:217
Definition Tools.h:256
virtual void rewind()=0
virtual bool hasNext()=0
virtual IObject * getNext()=0
virtual ~IObjectStream()
Definition Tools.h:258
virtual uint32_t size()=0
Definition Tools.h:225
virtual void storeToByteArray(byte **data, uint32_t &length)=0
virtual uint32_t getByteArraySize()=0
virtual void loadFromByteArray(const byte *data)=0
virtual ~ISerializable()
Definition Tools.h:227
Definition Tools.h:143
virtual std::string what()
std::string m_error
Definition Tools.h:150
virtual ~IllegalArgumentException()
Definition Tools.h:146
IllegalArgumentException(std::string s)
Definition Tools.h:154
virtual ~IllegalStateException()
Definition Tools.h:157
IllegalStateException(std::string s)
virtual std::string what()
std::string m_error
Definition Tools.h:161
Definition Tools.h:132
virtual ~IndexOutOfBoundsException()
Definition Tools.h:135
virtual std::string what()
std::string m_error
Definition Tools.h:139
Definition Tools.h:334
virtual bool intersectsInterval(IntervalType type, const double start, const double end) const
virtual double getLowerBound() const
virtual IntervalType getIntervalType() const
IntervalType m_type
Definition Tools.h:353
Interval(IntervalType, double, double)
virtual void setBounds(double, double)
virtual bool intersectsInterval(const IInterval &) const
double m_high
Definition Tools.h:355
double m_low
Definition Tools.h:354
Interval(const Interval &)
Interval(double, double)
virtual double getUpperBound() const
virtual bool operator!=(const Interval &) const
virtual IInterval & operator=(const IInterval &)
virtual ~Interval()
Definition Tools.h:340
virtual bool containsInterval(const IInterval &) const
virtual bool operator==(const Interval &) const
Definition Tools.h:187
NotSupportedException(std::string s)
virtual ~NotSupportedException()
Definition Tools.h:190
std::string m_error
Definition Tools.h:194
virtual std::string what()
Definition Tools.h:308
virtual ~PropertySet()
virtual void storeToByteArray(byte **data, uint32_t &length)
void setProperty(std::string property, Variant const &v)
virtual void loadFromByteArray(const byte *data)
virtual uint32_t getByteArraySize()
Variant getProperty(std::string property) const
PropertySet(const byte *data)
std::map< std::string, Variant > m_propertySet
Definition Tools.h:323
void removeProperty(std::string property)
Definition Tools.h:361
int16_t nextUniformShort()
virtual ~Random()
double nextUniformDouble()
int32_t nextUniformLong()
uint64_t nextUniformUnsignedLongLong()
uint32_t nextUniformUnsignedLong()
Random(uint32_t seed, uint16_t xsubi0)
int64_t nextUniformLongLong(int64_t low, int64_t high)
double nextUniformDouble(double low, double high)
uint32_t nextUniformUnsignedLong(uint32_t low, uint32_t high)
uint16_t nextUniformUnsignedShort()
void initDrand(uint32_t seed, uint16_t xsubi0)
uint16_t * m_pBuffer
Definition Tools.h:397
uint64_t nextUniformUnsignedLongLong(uint64_t low, uint64_t high)
int64_t nextUniformLongLong()
int32_t nextUniformLong(int32_t low, int32_t high)
Definition Tools.h:176
virtual std::string what()
ResourceLockedException(std::string s)
std::string m_error
Definition Tools.h:183
virtual ~ResourceLockedException()
Definition Tools.h:179
Definition Tools.h:475
BufferedFile * m_pFile
Definition Tools.h:505
void write(float i)
std::string getFileName() const
void write(uint32_t i)
virtual ~TemporaryFile()
std::string m_sFile
Definition Tools.h:504
void write(uint64_t i)
void write(const std::string &s)
void write(uint32_t u32Len, byte *pData)
void readBytes(uint32_t u32Len, byte **pData)
void write(uint8_t i)
void write(uint16_t i)
std::string readString()
void write(double i)
Definition Tools.h:279
int64_t llVal
Definition Tools.h:289
void * pvVal
Definition Tools.h:299
uint32_t ulVal
Definition Tools.h:295
uint16_t uiVal
Definition Tools.h:294
bool blVal
Definition Tools.h:297
float fltVal
Definition Tools.h:291
int32_t lVal
Definition Tools.h:288
double dblVal
Definition Tools.h:292
wchar_t * pwcVal
Definition Tools.h:300
VariantType m_varType
Definition Tools.h:283
char * pcVal
Definition Tools.h:298
byte bVal
Definition Tools.h:290
uint64_t ullVal
Definition Tools.h:296
int16_t iVal
Definition Tools.h:287
char cVal
Definition Tools.h:293
SIDX_DLL std::ostream & operator<<(std::ostream &os, const LineSegment &pt)
Definition PointerPool.h:33
IntervalType
Definition Tools.h:87
@ IT_RIGHTOPEN
Definition Tools.h:88
@ IT_LEFTOPEN
Definition Tools.h:89
@ IT_CLOSED
Definition Tools.h:91
@ IT_OPEN
Definition Tools.h:90
FileMode
Definition Tools.h:116
@ CREATE
Definition Tools.h:118
@ APPEND
Definition Tools.h:117
VariantType
Definition Tools.h:95
@ VT_BYTE
Definition Tools.h:97
@ VT_ULONGLONG
Definition Tools.h:111
@ VT_BOOL
Definition Tools.h:106
@ VT_EMPTY
Definition Tools.h:109
@ VT_FLOAT
Definition Tools.h:99
@ VT_CHAR
Definition Tools.h:101
@ VT_LONGLONG
Definition Tools.h:110
@ VT_PCHAR
Definition Tools.h:107
@ VT_INT
Definition Tools.h:104
@ VT_PWCHAR
Definition Tools.h:112
@ VT_LONG
Definition Tools.h:96
@ VT_DOUBLE
Definition Tools.h:100
@ VT_PVOID
Definition Tools.h:108
@ VT_UINT
Definition Tools.h:105
@ VT_ULONG
Definition Tools.h:103
@ VT_SHORT
Definition Tools.h:98
@ VT_USHORT
Definition Tools.h:102
char s
Definition opennurbs_string.cpp:32
#define SIDX_DLL
Definition sidx_export.h:41