# sets out_var to YES if filename has extension .h or .hpp, NO otherwise
function(is_header out_var filename)
  set(res "NO")
  get_filename_component(ext "${filename}" LAST_EXT)
  if((ext STREQUAL ".h") OR (ext STREQUAL ".hpp"))
    set(res "YES")
  endif()
  set("${out_var}" "${res}" PARENT_SCOPE)
endfunction()

function(remove_prefix out prefix str)
  string(LENGTH "${prefix}" len)
  string(SUBSTRING "${str}" ${len} -1 res)
  set("${out}" "${res}" PARENT_SCOPE)
endfunction()

function(is_prefix out prefix str)
  string(LENGTH "${prefix}" plen)
  string(LENGTH "${str}" slen)
  if(plen GREATER slen)
    set(res NO)
  else()
    string(SUBSTRING "${str}" 0 ${plen} pstr)
    if(pstr STREQUAL prefix)
      set(res YES)
    else()
      set(res NO)
    endif()
  endif()
  set(${out} ${res} PARENT_SCOPE)
endfunction()

function(create_build_dirs)
  foreach(src IN LISTS ARGV)
    get_filename_component(d "${src}" DIRECTORY)
    if(IS_ABSOLUTE "${d}")
      file(RELATIVE_PATH d "${CMAKE_CURRENT_SOURCE_DIR}" "${src}")
    endif()
    list(APPEND dirs "${d}")
  endforeach()
  list(REMOVE_DUPLICATES dirs)
  foreach(dir IN LISTS dirs)
    make_directory("${CMAKE_CURRENT_BINARY_DIR}/${dir}")
  endforeach()
endfunction()

function(fdb_find_sources out)
  file(GLOB res
    LIST_DIRECTORIES false
    RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
    CONFIGURE_DEPENDS "*.cpp" "*.c" "*.h" "*.hpp")
  file(GLOB_RECURSE res_includes
    LIST_DIRECTORIES false
    RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include"
    CONFIGURE_DEPENDS "include/*.cpp" "include/*.c" "include/*.h" "include/*.hpp")
  file(GLOB_RECURSE res_workloads
    LIST_DIRECTORIES false
    RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/workloads"
    CONFIGURE_DEPENDS "workloads/*.cpp" "workloads/*.c" "workloads/*.h" "workloads/*.hpp")

  foreach(f IN LISTS res_includes)
    list(APPEND res "include/${f}")
  endforeach()
  foreach(f IN LISTS res_workloads)
    list(APPEND res "workloads/${f}")
  endforeach()
  set(${out} "${res}" PARENT_SCOPE)
endfunction()