1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
#ifndef __ODGITESSELATOR_2_H_INCLUDED__
#define __ODGITESSELATOR_2_H_INCLUDED__
 
#include "TD_PackPush.h"
 
#include "OdList.h"
#include "OdArray.h"
 
#define ODGT_NAMESPACE OdGeTess2
#define ODGT_PTRTYPE Contour*
#define ODGT_PARENT
 
#define ODGT_MEMBERS2 \
public:\
static void *create(OdUInt32 num)\
{\
  return new Vertex[num];\
}
 
#define ODGT_MEMBERS \
friend class OptimizedHolder;\
 MemoryHolder *m_pHolder;\
public:\
static void *create(OdUInt32 num)\
{\
  return new Contour[num];\
}
 
#define ODGT_HOLDER , MemoryHolder &pHolder
#define ODGT_HOLDER2 , pHolder
 
namespace ODGT_NAMESPACE
{
  class Vertex;
  class Contour;
 
  class GE_TOOLKIT_EXPORT MemoryHolder
  {
  public:
    virtual Vertex *newVertex() = 0;
    virtual void deleteVertex(Vertex *) = 0;
 
    virtual Contour *newContour() = 0;
    virtual void deleteContour(Contour *) = 0;
 
    virtual ~MemoryHolder() {}
  };
};
 
 
#include "GeTess.h"
 
#define HOLDER_(A, B) struct A\
{\
  bool         m_First;\
  B*           m_FirstPage;\
  OdList< B* > m_Buf;\
  OdUInt32     m_pageSize;\
  OdUInt32     m_pos;\
\
  A(OdUInt32 pageSize)\
    : m_First(true)\
    , m_FirstPage(0)\
    , m_pageSize(pageSize)\
    , m_pos(0)\
  {\
    m_FirstPage = (B*)B::create(m_pageSize);\
    /*m_Buf.resize(1, (B*)B::create(m_pageSize) );*/\
  }\
\
  void freeMem()\
  {\
    delete []m_FirstPage; m_FirstPage = 0;\
    OdList< B* >::iterator pIt = m_Buf.begin();\
    OdList< B* >::iterator pItEnd = m_Buf.end();\
\
    while(pIt != pItEnd)\
    {\
      delete[] *pIt;\
      ++pIt;\
    }\
  }\
\
  ~A()\
  {\
    freeMem();\
  }\
\
  B* newOne()\
  {\
    if (m_pos == m_pageSize)\
    {\
      m_First = false;\
      m_Buf.push_front( (B*)B::create(m_pageSize) );\
      m_pos = 0;\
    }\
    if (m_First)\
      return &m_FirstPage[m_pos++];\
    return &(*m_Buf.begin())[m_pos++];\
  }\
};
 
/** \details
 
    <group TD_Namespaces>
*/
namespace OdGeTess2
{
  class GE_TOOLKIT_EXPORT OptimizedHolder : public MemoryHolder
  {
    HOLDER_(Holder_Contour, Contour)
    HOLDER_(Holder_Vertex, Vertex)
 
    Holder_Vertex  m_Vxs;
    Holder_Contour m_Ctrs;
 
  public:
    OptimizedHolder(OdUInt32 nPreAllocVertexes, OdUInt32 nPreAllocContours);
 
    virtual Vertex *newVertex();
    virtual void deleteVertex(Vertex * pVx);
 
    virtual Contour *newContour();
    virtual void deleteContour(Contour *);
 
    ~OptimizedHolder();
  };
};
 
#undef ODGT_NAMESPACE
#undef ODGT_PTRTYPE
#undef ODGT_PARENT
#undef ODGT_MEMBERS
#undef ODGT_HOLDER
#undef ODGT_HOLDER2
 
#include "TD_PackPop.h"
 
#endif // __ODGITESSELATOR_2_H_INCLUDED__