Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Analysis.AlgorithmBehavior/qhull-2012.1/src/libqhullcpp/QhullQh.cpp @ 10207

Last change on this file since 10207 was 10207, checked in by ascheibe, 11 years ago

#1886 added a unit test for volume calculation and the qhull library

File size: 3.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (c) 2008-2012 C.B. Barber. All rights reserved.
4** $Id: //main/2011/qhull/src/libqhullcpp/QhullQh.cpp#3 $$Change: 1464 $
5** $DateTime: 2012/01/25 22:58:41 $$Author: bbarber $
6**
7****************************************************************************/
8
9#//! QhullQh -- Qhull's global data structure, qhT, as a C++ class
10
11
12
13#include "QhullError.h"
14#include "QhullQh.h"
15#include "QhullStat.h"
16
17#include <sstream>
18#include <iostream>
19
20using std::cerr;
21using std::string;
22using std::vector;
23using std::ostream;
24
25#ifdef _MSC_VER  // Microsoft Visual C++ -- warning level 4
26#pragma warning( disable : 4611)  // interaction between '_setjmp' and C++ object destruction is non-portable
27#pragma warning( disable : 4996)  // function was declared deprecated(strcpy, localtime, etc.)
28#endif
29
30namespace orgQhull {
31
32#//Global variables
33
34#//Constructor, destructor, etc.
35
36//! If qh_QHpointer==0, invoke with placement new on qh_qh;
37//! Sets qh_qh and qh_qhstat.  Need to reset before UsingLibQhull.
38//! Derived from qh_new_qhull[user.c]
39QhullQh::
40QhullQh()
41{
42    static boolT firstcall = True;
43
44    if(firstcall){
45        if(qhmem.BUFinit!=0){
46            throw QhullError(10017, "Qhull error: qhmem already initialized by another class.");
47        }
48        qh_meminit(NULL);
49        firstcall= False;
50    }
51    // QhullQh() and UsingLibQhull() are the same
52#if qh_QHpointer
53    if(qh_qh){
54        if(qh old_qhstat){
55            throw QhullError(10041, "Qhull internal error: qh_qh.old_qhstat defined (%x) but qh_qh is active.  qh_qh not restored correctly.", 0, 0, 0.0, qh old_qhstat);
56        }
57        qh old_qhstat= qh_qhstat;
58        qh old_tempstack= qhmem.tempstack;
59        qh_qhstat= 0;
60        qhmem.tempstack= 0;
61    }
62    qh_qh= static_cast<qhT*>(this);
63#else
64    if(strncmp(qh qhull, "qhull", 5) == 0){
65        throw QhullError(10022, "Qhull error: Qhull already initialized as run %d", qh run_id);
66    }
67#endif
68    // NOerrors -- Does not call qh_errexit()
69    qh_initstatistics();
70    // NOerrors -- Does not call qh_errexit()
71    qh_initqhull_start2(NULL, NULL, qh_FILEstderr);
72}//QhullQh
73
74//! UsingLibQhull must be declared along with QhullQh
75QhullQh::
76~QhullQh()
77{
78#if qh_QHpointer
79    if(!qh_qh){
80        QhullError e(10042, "Qhull internal error: qh_qh undefined.  Was ~QhullQh() invoked independent of UsingLibQhull?", qh run_id, 0, 0, qh_qh);
81        e.logError();
82    }else if(!qh_qhstat){
83        QhullError e(10043, "Qhull internal error: qh_qhstat null.  Is another thread running?");
84        e.logError();
85    }else if(qh_qh!=this){
86        QhullError e(10044, "Qhull error: ~QhullQh() invoked independent of UsingLibQhull. qh_qh %x (runId %d) vs. QhullQh.runId %d.", qh run_id, run_id, 0.0, qh_qh);
87        e.logError();
88    }else{
89        qh_freeqhull2(qh_ALL); // sets qh.NOerrexit.  Clears struct *qh_qh including run_id, but not qh_qh itself
90    }
91#else
92    if(&qh_qh!=this){
93        QhullError e(10045, "Qhull error: ~QhullQh() invoked independent of UsingLibQhull. qh_qh %x (runId %d) vs. QhullQh.runId %d.", qh run_id, run_id, 0.0, qh_qh);
94        e.logError();
95    }else{
96        qh_freeqhull2(qh_ALL); // sets qh.NOerrexit.  Clears struct *qh_qh including run_id, but not qh_qh itself
97    }
98#endif
99}//~QhullQh
100
101#//Parallel Access
102
103}//namespace orgQhull
104
Note: See TracBrowser for help on using the repository browser.