library(geometries)
library(Rcpp)

You can include all utility functions through the main header

#include "geometries/utils/utils.hpp"

Or include the specific ones you need

#include "geometries/utils/columns/columns.hpp"
#include "geometries/utils/lines/lines.hpp"
#include "geometries/utils/lists/list.hpp"
#include "geometries/utils/matrix/matrix.hpp"
#include "geometries/utils/sexp/sexp.hpp"
#include "geometries/utils/subset/subset.hpp"
#include "geometries/utils/unique/unique_ids.hpp"
#include "geometries/utils/vectors/vectors.hpp"

columns

lines

## id positions
## 
## takes a sorted vector and returns the start & end indices of each unique element
cppFunction(
  depends = 'geometries'
  , includes = '#include "geometries/utils/lines/lines.hpp"'
  , code = '
    Rcpp::IntegerMatrix id_positions( SEXP x ) {
      return geometries::utils::id_positions( x );
    }
  '
)

x <- c( rep(1, 5), rep(2, 10), rep(3, 6), rep(4, 2) )
id_positions( x )
#      [,1] [,2]
# [1,]    0    4
# [2,]    5   14
# [3,]   15   20
# [4,]   21   22

list

matrix

sexp

subset

unique

## Unique

## retains the original input order

cppFunction(
  depends = "geometries"
  , includes = '#include "geometries/utils/unique/unique_sort.hpp"'
  , code = '
    SEXP sorted_unique( SEXP x ) {
      return geometries::utils::get_sexp_unique( x );
    }
  '
)

## compare with
cppFunction(
  code = '
    Rcpp::NumericVector rcpp_unique( Rcpp::NumericVector x ) {
      return Rcpp::unique( x );
    }
  '
)

x <- c(1,1,1,3,3,4,4,2)

sorted_unique( x )
# [1] 1 3 4 2
rcpp_unique( x )
# [1] 2 3 4 1

vectors