Skip to content

Commit 5848c60

Browse files
authored
parametric curve limits: access by reference (#25)
2 parents 402c86a + cdc071f commit 5848c60

4 files changed

Lines changed: 52 additions & 7 deletions

File tree

include/fitpack_parametric_curves_c.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ FP_REAL fitpack_parametric_curve_c_smoothing (fitpack_parametric_curve_c *
5959
FP_REAL fitpack_parametric_curve_c_mse (fitpack_parametric_curve_c *self);
6060
FP_SIZE fitpack_parametric_curve_c_degree (fitpack_parametric_curve_c *self);
6161
FP_SIZE fitpack_parametric_curve_c_idim (fitpack_parametric_curve_c *self);
62-
FP_REAL fitpack_parametric_curve_c_ubegin (fitpack_parametric_curve_c *self);
63-
FP_REAL fitpack_parametric_curve_c_uend (fitpack_parametric_curve_c *self);
62+
FP_REAL fitpack_parametric_curve_c_ubegin (const fitpack_parametric_curve_c *self);
63+
FP_REAL fitpack_parametric_curve_c_uend (const fitpack_parametric_curve_c *self);
64+
FP_REAL* fitpack_parametric_curve_c_ubegin_ref (fitpack_parametric_curve_c *self);
65+
FP_REAL* fitpack_parametric_curve_c_uend_ref (fitpack_parametric_curve_c *self);
6466

6567
#ifdef __cplusplus
6668
}

include/fpParametricCurve.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,13 @@ class fpParametricCurve
8787
const FP_REAL smoothing() { return fitpack_parametric_curve_c_smoothing(&cptr); };
8888
const FP_REAL mse () { return fitpack_parametric_curve_c_mse(&cptr); };
8989
const FP_SIZE ndim () { return fitpack_parametric_curve_c_idim(&cptr); };
90-
const FP_REAL ubegin () { return fitpack_parametric_curve_c_ubegin(&cptr); };
91-
const FP_REAL uend () { return fitpack_parametric_curve_c_uend(&cptr); };
90+
const FP_REAL ubegin () const { return fitpack_parametric_curve_c_ubegin(&cptr);} ;
91+
const FP_REAL uend () const { return fitpack_parametric_curve_c_uend(&cptr); };
92+
93+
FP_REAL& ubegin() { return *fitpack_parametric_curve_c_ubegin_ref(&cptr); };
94+
FP_REAL& uend() { return *fitpack_parametric_curve_c_uend_ref(&cptr); };
95+
96+
9297

9398
// Get value at u
9499
fpPoint eval(FP_REAL u, FP_FLAG* ierr=nullptr)

src/fitpack_parametric.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ module fitpack_parametric_curves
5151

5252
!> Interval boundaries
5353
real(FP_REAL) :: ubegin = zero
54-
real(FP_REAL) :: uend = zero
54+
real(FP_REAL) :: uend = zero
5555

5656
! Node weights
5757
real(FP_REAL), allocatable :: sp(:),w(:)
@@ -270,6 +270,7 @@ subroutine new_points(this,x,u,w)
270270
this%uend = maxval(u)
271271

272272
else
273+
273274
allocate(this%u(m),source=zero)
274275
this%x = x
275276

src/fitpack_parametric_c.f90

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ end function fitpack_parametric_curve_c_mse
327327
!> Get begin endpoint
328328
real(FP_REAL) function fitpack_parametric_curve_c_ubegin(this) &
329329
bind(c,name='fitpack_parametric_curve_c_ubegin')
330-
type(fitpack_parametric_curve_c), intent(inout) :: this
330+
type(fitpack_parametric_curve_c), intent(in) :: this
331331

332332
type(fitpack_parametric_curve), pointer :: fcurve
333333

@@ -345,7 +345,7 @@ end function fitpack_parametric_curve_c_ubegin
345345
!> Get end endpoint
346346
real(FP_REAL) function fitpack_parametric_curve_c_uend(this) &
347347
bind(c,name='fitpack_parametric_curve_c_uend')
348-
type(fitpack_parametric_curve_c), intent(inout) :: this
348+
type(fitpack_parametric_curve_c), intent(in) :: this
349349

350350
type(fitpack_parametric_curve), pointer :: fcurve
351351

@@ -360,6 +360,43 @@ real(FP_REAL) function fitpack_parametric_curve_c_uend(this) &
360360

361361
end function fitpack_parametric_curve_c_uend
362362

363+
!> Get a reference to begin endpoint
364+
type(c_ptr) function fitpack_parametric_curve_c_ubegin_ref(this,ubegin) &
365+
bind(c,name='fitpack_parametric_curve_c_ubegin_ref') result(ptr)
366+
type(fitpack_parametric_curve_c), intent(inout) :: this
367+
type(c_ptr), intent(out) :: ubegin
368+
369+
type(fitpack_parametric_curve), pointer :: fcurve
370+
371+
!> Get object; allocate it in case
372+
call fitpack_parametric_curve_c_get_pointer(this,fcurve)
373+
374+
if (associated(fcurve)) then
375+
ptr = c_loc(fcurve%ubegin)
376+
else
377+
ptr = c_null_ptr
378+
end if
379+
380+
end function fitpack_parametric_curve_c_ubegin_ref
381+
382+
!> Get end endpoint
383+
type(c_ptr) function fitpack_parametric_curve_c_uend_ref(this) &
384+
bind(c,name='fitpack_parametric_curve_c_uend_ref') result(ptr)
385+
type(fitpack_parametric_curve_c), intent(inout) :: this
386+
387+
type(fitpack_parametric_curve), pointer :: fcurve
388+
389+
!> Get object; allocate it in case
390+
call fitpack_parametric_curve_c_get_pointer(this,fcurve)
391+
392+
if (associated(fcurve)) then
393+
ptr = c_loc(fcurve%uend)
394+
else
395+
ptr = c_null_ptr
396+
end if
397+
398+
end function fitpack_parametric_curve_c_uend_ref
399+
363400
!> Get spline degree
364401
integer(FP_SIZE) function fitpack_parametric_curve_c_degree(this) &
365402
bind(c,name='fitpack_parametric_curve_c_degree')

0 commit comments

Comments
 (0)