1 /****************************************************************************
2 **
3 ** Copyright (c) 2008-2020 C.B. Barber. All rights reserved.
4 ** $Id: //main/2019/qhull/src/libqhullcpp/QhullUser.h#7 $$Change: 3010 $
5 ** $DateTime: 2020/07/30 22:14:11 $$Author: bbarber $
6 **
7 ****************************************************************************/
8 
9 #ifndef QhullUser_H
10 #define QhullUser_H
11 
12 #include "libqhull_r/qhull_ra.h"
13 #include "libqhullcpp/QhullPoint.h"
14 #include "libqhullcpp/PointCoordinates.h"
15 
16 #include <stdarg.h>
17 #include <string>
18 #include <vector>
19 #include <istream>
20 #include <ostream>
21 #include <sstream>
22 
23 namespace orgQhull{
24 
25 #//!\name Defined here
26     //! QhullUser -- custom C++ interfaces into Qhull (via qh_fprintf)
27     class QhullUser;
28     // qh_fprintf is defined below.  It replaces libqhull_r/userprintf_r.c
29 
30 #//!\name Used here
31     class QhullQh;
32 
33     class QhullUser{
34 
35     private:
36 #//!\name Fields
37         QhullQh *       qh_qh;          //!< QhullQh/qhT for access to libqhull_r
38         void *          previous_user;  //!< previous qh.cpp_user, restored on deconstruction
39         std::vector<std::vector<double> > doubles_vector;  //! vectors for capturing ints and doubles
40         std::vector<std::vector<int> >  ints_vector;
41         std::vector<int>                fprintf_ints;
42         std::vector<double>             fprintf_doubles;
43         std::vector<int>                fprintf_codes;
44         std::vector<std::string>        fprintf_strings;
45         int             num_facets;
46         int             num_neighbors;
47         int             num_numbers;
48         int             num_points;
49         int             num_results;
50         int             num_ridges;
51         int             num_vectors;
52         int             num_vertices;
53         int             qhull_dim;
54         int             delaunay_dim;   //! ints for capturing fprintf fields
55 
56     public:
57 #//!\name Construct
58                         QhullUser(QhullQh *qqh);
59                         ~QhullUser();
60     private:                // Disable default constructor, copy constructor, and assignment
61                         QhullUser();
62                         QhullUser(const QhullUser &);
63         QhullUser &     operator=(const QhullUser &);
64     private:
65 
66     public:
67 #//!\name GetSet
68         void            appendCode(int msgCode) { fprintf_codes.push_back(msgCode); }
69         void            appendDouble(double a) { fprintf_doubles.push_back(a); }
70         void            appendInt(int i) { fprintf_ints.push_back(i); }
71         void            appendAndClearDoubles() { doubles_vector.push_back(fprintf_doubles); fprintf_doubles.clear(); }
72         void            appendAndClearInts() { ints_vector.push_back(fprintf_ints); fprintf_ints.clear(); }
73         void            clear();
74         void            clearDoubles() { fprintf_doubles.clear(); }
75         void            clearDoublesVector() { doubles_vector.clear(); }
76         void            clearInts() { fprintf_ints.clear(); }
77         void            clearIntsVector() { ints_vector.clear(); }
78         const std::vector<int> &codes() const { return fprintf_codes; }
79         int             delaunayDim() const { return delaunay_dim; }
80         const std::vector<std::vector<double> > &doublesVector() const { return doubles_vector; }
81         const std::vector<double> &doubles() const { return fprintf_doubles; }
82         int             firstCode() const { return (fprintf_codes.size() == 0 ? -1 : fprintf_codes[0]); }
83         const std::vector<int> &ints() const { return fprintf_ints; }
84         const std::vector<std::vector<int> > &intsVector() const { return ints_vector; }
85         int             numDoubles() const { return (int)doubles_vector.size();  }
86         int             numFacets() const { return num_facets; }
87         int             numInts() const { return (int)ints_vector.size(); }
88         int             numNeighbors() const { return num_neighbors; }
89         int             numNumbers() const { return num_numbers; }
90         int             numPoints() const { return num_points; }
91         int             numResults() const { return num_results; }
92         int             numRidges() const { return num_ridges; }
93         int             numVectors() const { return num_vectors; }
94         int             numVertices() const { return num_vertices; }
95         QhullQh *       qh() const { return qh_qh; }
96         int             qhullDim() const { return qhull_dim; }
97         void            setDelaunayDim(int i) { delaunay_dim= i; }
98         void            setNumFacets(int i) { num_facets= i; }
99         void            setNumResults(int i) { num_results= i; }
100         void            setNumRidges(int i) { num_ridges= i; }
101         void            setNumNeighbors(int i) { num_neighbors= i; }
102         void            setNumNumbers(int i) { num_numbers= i; }
103         void            setNumPoints(int i) { num_points= i; }
104         void            setNumVectors(int i) { num_vectors= i; }
105         void            setNumVertices(int i) { num_vertices= i; }
106         void            setQhullDim(int i) { qhull_dim= i; }
107 
108 #//!\name Methods
109         void            captureOn();
110         void            captureOff();
111 };//class QhullUser
112 
113 }//namespace orgQhull
114 
115 #endif // QhullUser_H
116