PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ ptarray_insert_point()

int ptarray_insert_point ( POINTARRAY pa,
const POINT4D p,
uint32_t  where 
)

Insert a point into an existing POINTARRAY.

Zero is the index of the start of the array.

Definition at line 85 of file ptarray.c.

86{
87 if (!pa || !p)
88 return LW_FAILURE;
89 size_t point_size = ptarray_point_size(pa);
90 LWDEBUGF(5,"pa = %p; p = %p; where = %d", pa, p, where);
91 LWDEBUGF(5,"pa->npoints = %d; pa->maxpoints = %d", pa->npoints, pa->maxpoints);
92
93 if ( FLAGS_GET_READONLY(pa->flags) )
94 {
95 lwerror("ptarray_insert_point: called on read-only point array");
96 return LW_FAILURE;
97 }
98
99 /* Error on invalid offset value */
100 if ( where > pa->npoints )
101 {
102 lwerror("ptarray_insert_point: offset out of range (%d)", where);
103 return LW_FAILURE;
104 }
105
106 /* If we have no storage, let's allocate some */
107 if( pa->maxpoints == 0 || ! pa->serialized_pointlist )
108 {
109 pa->maxpoints = 32;
110 pa->npoints = 0;
112 }
113
114 /* Error out if we have a bad situation */
115 if ( pa->npoints > pa->maxpoints )
116 {
117 lwerror("npoints (%d) is greater than maxpoints (%d)", pa->npoints, pa->maxpoints);
118 return LW_FAILURE;
119 }
120
121 /* Check if we have enough storage, add more if necessary */
122 if( pa->npoints == pa->maxpoints )
123 {
124 pa->maxpoints *= 2;
126 }
127
128 /* Make space to insert the new point */
129 if( where < pa->npoints )
130 {
131 size_t copy_size = point_size * (pa->npoints - where);
132 memmove(getPoint_internal(pa, where+1), getPoint_internal(pa, where), copy_size);
133 LWDEBUGF(5,"copying %zu bytes to start vertex %d from start vertex %d", copy_size, where+1, where);
134 }
135
136 /* We have one more point */
137 ++pa->npoints;
138
139 /* Copy the new point into the gap */
140 ptarray_set_point4d(pa, where, p);
141 LWDEBUGF(5,"copying new point to start vertex %zu", point_size);
142
143 return LW_SUCCESS;
144}
void * lwrealloc(void *mem, size_t size)
Definition lwutil.c:242
#define LW_FAILURE
Definition liblwgeom.h:96
#define LW_SUCCESS
Definition liblwgeom.h:97
#define FLAGS_GET_READONLY(flags)
Definition liblwgeom.h:169
void * lwalloc(size_t size)
Definition lwutil.c:227
void ptarray_set_point4d(POINTARRAY *pa, uint32_t n, const POINT4D *p4d)
Definition lwgeom_api.c:369
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static uint8_t * getPoint_internal(const POINTARRAY *pa, uint32_t n)
Definition lwinline.h:75
static size_t ptarray_point_size(const POINTARRAY *pa)
Definition lwinline.h:56
lwflags_t flags
Definition liblwgeom.h:431
uint32_t maxpoints
Definition liblwgeom.h:428
uint32_t npoints
Definition liblwgeom.h:427
uint8_t * serialized_pointlist
Definition liblwgeom.h:434

References POINTARRAY::flags, FLAGS_GET_READONLY, getPoint_internal(), LW_FAILURE, LW_SUCCESS, lwalloc(), LWDEBUGF, lwerror(), lwrealloc(), POINTARRAY::maxpoints, POINTARRAY::npoints, ptarray_point_size(), ptarray_set_point4d(), and POINTARRAY::serialized_pointlist.

Referenced by _lwt_SplitAllEdgesToNewNode(), geography_centroid_from_mpoly(), lwline_add_lwpoint(), ptarray_append_point(), test_ptarray_insert_point(), and test_trim_bits().

Here is the call graph for this function:
Here is the caller graph for this function: