library(geometries)
library(Rcpp)
#include "geometries/geometries/dimensions.hpp"
cppFunction(
  depends = "geometries"
  , includes = '#include "geometries/shapes/shapes.hpp"'
  , code = '
    SEXP polygon( SEXP df, SEXP geometry_cols, SEXP line_id ) {
      return geometries::shapes::to_listMat( df, geometry_cols, line_id );
    }
  '
)
## Count Coordinates
##
## either counts the number of coordinates in a given geometry,
cppFunction(
  depends = 'geometries'
  , includes = '#include "geometries/geometries/dimensions.hpp"'
  , code = '
    R_xlen_t count_coordinates( SEXP x ) {
      R_xlen_t count = 0;
      geometries::coordinates::count_coordinates( x, count );
      return count;
    }
  '
)

df <- data.frame(
  x = 1:10
  , y = 10:1
  , z = 21:30
  , m = 30:21
  , val = letters[1:10]
  , id = c( rep(1,5), rep(2,5) )
)

poly <- polygon( df, c("x","y"), c("id") )

count_coordinates( poly )
# [1] 10
## Coordinate indices
## 
## gives the start and end indices of geometries
cppFunction(
  depends = 'geometries'
  , includes = '#include "geometries/geometries/dimensions.hpp"'
  , code = '
    Rcpp::IntegerMatrix coordinate_indices( SEXP x ) {
      return geometries::coordinates::coordinate_indices( x );
    }
  '
)

x <- 1:2

coordinate_indices( x )
#      [,1] [,2]
# [1,]    0    0

m <- matrix(1:6, ncol = 2)

coordinate_indices( m )
#      [,1] [,2]
# [1,]    0    2

l <- list(
  matrix(1:20, ncol = 2 )
  , matrix(1:6, ncol = 2)
  , matrix(1:10, ncol = 2)
)

coordinate_indices( l )
#      [,1] [,2]
# [1,]    0    9
# [2,]   10   12
# [3,]   13   17