First Commit
This commit is contained in:
commit
8a6c7106e3
49
Makefile
Normal file
49
Makefile
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# nmake Makefile for MSVC (Windows)
|
||||||
|
# Builds src/main.cpp against installed OSRM, Boost.
|
||||||
|
# Output executable goes into bin/
|
||||||
|
|
||||||
|
# Compiler
|
||||||
|
CXX = cl
|
||||||
|
|
||||||
|
# Include directories (adjust if your paths differ)
|
||||||
|
INCLUDES = /I"C:\Users\TRIZ\clones\osrm-backend\include" ^
|
||||||
|
/I"C:\OSRM\include" ^
|
||||||
|
/I"C:\Users\TRIZ\clones\osrm-backend\vcpkg_installed\x64-windows\include" ^
|
||||||
|
/I"C:\Users\TRIZ\clones\osrm-backend\third_party\fmt\include"
|
||||||
|
|
||||||
|
# Libraries (full paths to .lib files)
|
||||||
|
LIBS = "C:\OSRM\lib\osrm.lib" "C:\Users\TRIZ\clones\osrm-backend\vcpkg_installed\x64-windows\lib\*.lib" AdvAPI32.lib
|
||||||
|
|
||||||
|
# Compiler flags
|
||||||
|
CXXFLAGS = /EHsc /MD /O3 /nologo /utf-8 /std:c++17 /DFMT_HEADER_ONLY
|
||||||
|
|
||||||
|
LFLAGS = /nologo
|
||||||
|
|
||||||
|
# Source files
|
||||||
|
SRCS = src\main.cpp kdtree\kdtree.c tomlcpp\tomlcpp.cpp tomlcpp\toml.c
|
||||||
|
OBJS = $(SRCS:.cpp=.obj)
|
||||||
|
|
||||||
|
# Output directory and target
|
||||||
|
OUTDIR = bin
|
||||||
|
TARGET = $(OUTDIR)\trackengine.exe
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all: $(TARGET) run
|
||||||
|
|
||||||
|
# Link object files into executable
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
if not exist $(OUTDIR) mkdir $(OUTDIR)
|
||||||
|
$(CXX) $(OBJS) $(LIBS) $(LFLAGS) /Fe$(TARGET)
|
||||||
|
|
||||||
|
# Compile .cpp into .obj
|
||||||
|
.cpp.obj:
|
||||||
|
$(CXX) $(CXXFLAGS) $(INCLUDES) /c $< /Fo$@
|
||||||
|
|
||||||
|
run:
|
||||||
|
@echo Running $(TARGET)...
|
||||||
|
type C:\Users\TRIZ\clones\tracluster\gps_260205_070000.csv | $(TARGET)
|
||||||
|
|
||||||
|
# Clean
|
||||||
|
clean:
|
||||||
|
del /Q $(OBJS) 2>nul
|
||||||
|
del /Q $(TARGET) 2>nul
|
||||||
BIN
bin/advapi32.dll
Normal file
BIN
bin/advapi32.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-convert-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-convert-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-environment-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-environment-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-filesystem-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-filesystem-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-heap-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-heap-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-locale-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-locale-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-math-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-math-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-runtime-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-runtime-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-stdio-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-stdio-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/api-ms-win-crt-string-l1-1-0.dll
Normal file
BIN
bin/api-ms-win-crt-string-l1-1-0.dll
Normal file
Binary file not shown.
BIN
bin/boost_iostreams-vc145-mt-x64-1_90.dll
Normal file
BIN
bin/boost_iostreams-vc145-mt-x64-1_90.dll
Normal file
Binary file not shown.
BIN
bin/bz2.dll
Normal file
BIN
bin/bz2.dll
Normal file
Binary file not shown.
12
bin/config.toml
Normal file
12
bin/config.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[T-DBSCAN]
|
||||||
|
eps_time = 60 # 60*9
|
||||||
|
k = 3
|
||||||
|
min_pts = 5
|
||||||
|
|
||||||
|
[Douglas]
|
||||||
|
eps = -1
|
||||||
|
base = 3
|
||||||
|
k = 1.5
|
||||||
|
|
||||||
|
[OSRM]
|
||||||
|
path = "C:\\Users\\TRIZ\\clones\\osrm_test\\data\\algeria-260108.osrm"
|
||||||
BIN
bin/kernel32.dll
Normal file
BIN
bin/kernel32.dll
Normal file
Binary file not shown.
BIN
bin/libexpat.dll
Normal file
BIN
bin/libexpat.dll
Normal file
Binary file not shown.
BIN
bin/liblzma.dll
Normal file
BIN
bin/liblzma.dll
Normal file
Binary file not shown.
BIN
bin/msvcp140.dll
Normal file
BIN
bin/msvcp140.dll
Normal file
Binary file not shown.
BIN
bin/tbb12.dll
Normal file
BIN
bin/tbb12.dll
Normal file
Binary file not shown.
BIN
bin/trackengine.exe
Normal file
BIN
bin/trackengine.exe
Normal file
Binary file not shown.
BIN
bin/zlib1.dll
Normal file
BIN
bin/zlib1.dll
Normal file
Binary file not shown.
BIN
bin/zstd.dll
Normal file
BIN
bin/zstd.dll
Normal file
Binary file not shown.
BIN
kdtree.obj
Normal file
BIN
kdtree.obj
Normal file
Binary file not shown.
844
kdtree/kdtree.c
Normal file
844
kdtree/kdtree.c
Normal file
@ -0,0 +1,844 @@
|
|||||||
|
/*
|
||||||
|
This file is part of ``kdtree'', a library for working with kd-trees.
|
||||||
|
Copyright (C) 2007-2011 John Tsiombikas <nuclear@member.fsf.org>
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/* single nearest neighbor search written by Tamas Nepusz <tamas@cs.rhul.ac.uk> */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "kdtree.h"
|
||||||
|
|
||||||
|
#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32)
|
||||||
|
#include <malloc.h>
|
||||||
|
#define alloca _alloca
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_LIST_NODE_ALLOCATOR
|
||||||
|
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
#include <pthread.h>
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef I_WANT_THREAD_BUGS
|
||||||
|
#error "You are compiling with the fast list node allocator, with pthreads disabled! This WILL break if used from multiple threads."
|
||||||
|
#endif /* I want thread bugs */
|
||||||
|
|
||||||
|
#endif /* pthread support */
|
||||||
|
#endif /* use list node allocator */
|
||||||
|
|
||||||
|
struct kdhyperrect {
|
||||||
|
int dim;
|
||||||
|
double *min, *max; /* minimum/maximum coords */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kdnode {
|
||||||
|
double *pos;
|
||||||
|
int dir;
|
||||||
|
void *data;
|
||||||
|
|
||||||
|
struct kdnode *left, *right; /* negative/positive side */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct res_node {
|
||||||
|
struct kdnode *item;
|
||||||
|
double dist_sq;
|
||||||
|
struct res_node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kdtree {
|
||||||
|
int dim;
|
||||||
|
struct kdnode *root;
|
||||||
|
struct kdhyperrect *rect;
|
||||||
|
void (*destr)(void*);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kdres {
|
||||||
|
struct kdtree *tree;
|
||||||
|
struct res_node *rlist, *riter;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SQ(x) ((x) * (x))
|
||||||
|
|
||||||
|
|
||||||
|
static void clear_rec(struct kdnode *node, void (*destr)(void*));
|
||||||
|
static int insert_rec(struct kdnode **node, const double *pos, void *data, int dir, int dim);
|
||||||
|
static int rlist_insert(struct res_node *list, struct kdnode *item, double dist_sq);
|
||||||
|
static void clear_results(struct kdres *set);
|
||||||
|
|
||||||
|
static struct kdhyperrect* hyperrect_create(int dim, const double *min, const double *max);
|
||||||
|
static void hyperrect_free(struct kdhyperrect *rect);
|
||||||
|
static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect);
|
||||||
|
static void hyperrect_extend(struct kdhyperrect *rect, const double *pos);
|
||||||
|
static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos);
|
||||||
|
|
||||||
|
#ifdef USE_LIST_NODE_ALLOCATOR
|
||||||
|
static struct res_node *alloc_resnode(void);
|
||||||
|
static void free_resnode(struct res_node*);
|
||||||
|
#else
|
||||||
|
#define alloc_resnode() malloc(sizeof(struct res_node))
|
||||||
|
#define free_resnode(n) free(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct kdtree *kd_create(int k)
|
||||||
|
{
|
||||||
|
struct kdtree *tree;
|
||||||
|
|
||||||
|
if(!(tree = malloc(sizeof *tree))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tree->dim = k;
|
||||||
|
tree->root = 0;
|
||||||
|
tree->destr = 0;
|
||||||
|
tree->rect = 0;
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kd_free(struct kdtree *tree)
|
||||||
|
{
|
||||||
|
if(tree) {
|
||||||
|
kd_clear(tree);
|
||||||
|
free(tree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clear_rec(struct kdnode *node, void (*destr)(void*))
|
||||||
|
{
|
||||||
|
if(!node) return;
|
||||||
|
|
||||||
|
clear_rec(node->left, destr);
|
||||||
|
clear_rec(node->right, destr);
|
||||||
|
|
||||||
|
if(destr) {
|
||||||
|
destr(node->data);
|
||||||
|
}
|
||||||
|
free(node->pos);
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kd_clear(struct kdtree *tree)
|
||||||
|
{
|
||||||
|
clear_rec(tree->root, tree->destr);
|
||||||
|
tree->root = 0;
|
||||||
|
|
||||||
|
if (tree->rect) {
|
||||||
|
hyperrect_free(tree->rect);
|
||||||
|
tree->rect = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void kd_data_destructor(struct kdtree *tree, void (*destr)(void*))
|
||||||
|
{
|
||||||
|
tree->destr = destr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int insert_rec(struct kdnode **nptr, const double *pos, void *data, int dir, int dim)
|
||||||
|
{
|
||||||
|
int new_dir;
|
||||||
|
struct kdnode *node;
|
||||||
|
|
||||||
|
if(!*nptr) {
|
||||||
|
if(!(node = malloc(sizeof *node))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(!(node->pos = malloc(dim * sizeof *node->pos))) {
|
||||||
|
free(node);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy(node->pos, pos, dim * sizeof *node->pos);
|
||||||
|
node->data = data;
|
||||||
|
node->dir = dir;
|
||||||
|
node->left = node->right = 0;
|
||||||
|
*nptr = node;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = *nptr;
|
||||||
|
new_dir = (node->dir + 1) % dim;
|
||||||
|
if(pos[node->dir] < node->pos[node->dir]) {
|
||||||
|
return insert_rec(&(*nptr)->left, pos, data, new_dir, dim);
|
||||||
|
}
|
||||||
|
return insert_rec(&(*nptr)->right, pos, data, new_dir, dim);
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_insert(struct kdtree *tree, const double *pos, void *data)
|
||||||
|
{
|
||||||
|
if (insert_rec(&tree->root, pos, data, 0, tree->dim)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tree->rect == 0) {
|
||||||
|
tree->rect = hyperrect_create(tree->dim, pos, pos);
|
||||||
|
} else {
|
||||||
|
hyperrect_extend(tree->rect, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_insertf(struct kdtree *tree, const float *pos, void *data)
|
||||||
|
{
|
||||||
|
static double sbuf[16];
|
||||||
|
double *bptr, *buf = 0;
|
||||||
|
int res, dim = tree->dim;
|
||||||
|
|
||||||
|
if(dim > 16) {
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(dim <= 256)
|
||||||
|
bptr = buf = alloca(dim * sizeof *bptr);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if(!(bptr = buf = malloc(dim * sizeof *bptr))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bptr = buf = sbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(dim-- > 0) {
|
||||||
|
*bptr++ = *pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = kd_insert(tree, buf, data);
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(tree->dim > 256)
|
||||||
|
#else
|
||||||
|
if(tree->dim > 16)
|
||||||
|
#endif
|
||||||
|
free(buf);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_insert3(struct kdtree *tree, double x, double y, double z, void *data)
|
||||||
|
{
|
||||||
|
double buf[3];
|
||||||
|
buf[0] = x;
|
||||||
|
buf[1] = y;
|
||||||
|
buf[2] = z;
|
||||||
|
return kd_insert(tree, buf, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_insert3f(struct kdtree *tree, float x, float y, float z, void *data)
|
||||||
|
{
|
||||||
|
double buf[3];
|
||||||
|
buf[0] = x;
|
||||||
|
buf[1] = y;
|
||||||
|
buf[2] = z;
|
||||||
|
return kd_insert(tree, buf, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int find_nearest(struct kdnode *node, const double *pos, double range, struct res_node *list, int ordered, int dim)
|
||||||
|
{
|
||||||
|
double dist_sq, dx;
|
||||||
|
int i, ret, added_res = 0;
|
||||||
|
|
||||||
|
if(!node) return 0;
|
||||||
|
|
||||||
|
dist_sq = 0;
|
||||||
|
for(i=0; i<dim; i++) {
|
||||||
|
dist_sq += SQ(node->pos[i] - pos[i]);
|
||||||
|
}
|
||||||
|
if(dist_sq <= SQ(range)) {
|
||||||
|
if(rlist_insert(list, node, ordered ? dist_sq : -1.0) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
added_res = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dx = pos[node->dir] - node->pos[node->dir];
|
||||||
|
|
||||||
|
ret = find_nearest(dx <= 0.0 ? node->left : node->right, pos, range, list, ordered, dim);
|
||||||
|
if(ret >= 0 && fabs(dx) < range) {
|
||||||
|
added_res += ret;
|
||||||
|
ret = find_nearest(dx <= 0.0 ? node->right : node->left, pos, range, list, ordered, dim);
|
||||||
|
}
|
||||||
|
if(ret == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
added_res += ret;
|
||||||
|
|
||||||
|
return added_res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static int find_nearest_n(struct kdnode *node, const double *pos, double range, int num, struct rheap *heap, int dim)
|
||||||
|
{
|
||||||
|
double dist_sq, dx;
|
||||||
|
int i, ret, added_res = 0;
|
||||||
|
|
||||||
|
if(!node) return 0;
|
||||||
|
|
||||||
|
/* if the photon is close enough, add it to the result heap */
|
||||||
|
dist_sq = 0;
|
||||||
|
for(i=0; i<dim; i++) {
|
||||||
|
dist_sq += SQ(node->pos[i] - pos[i]);
|
||||||
|
}
|
||||||
|
if(dist_sq <= range_sq) {
|
||||||
|
if(heap->size >= num) {
|
||||||
|
/* get furthest element */
|
||||||
|
struct res_node *maxelem = rheap_get_max(heap);
|
||||||
|
|
||||||
|
/* and check if the new one is closer than that */
|
||||||
|
if(maxelem->dist_sq > dist_sq) {
|
||||||
|
rheap_remove_max(heap);
|
||||||
|
|
||||||
|
if(rheap_insert(heap, node, dist_sq) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
added_res = 1;
|
||||||
|
|
||||||
|
range_sq = dist_sq;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(rheap_insert(heap, node, dist_sq) == -1) {
|
||||||
|
return =1;
|
||||||
|
}
|
||||||
|
added_res = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* find signed distance from the splitting plane */
|
||||||
|
dx = pos[node->dir] - node->pos[node->dir];
|
||||||
|
|
||||||
|
ret = find_nearest_n(dx <= 0.0 ? node->left : node->right, pos, range, num, heap, dim);
|
||||||
|
if(ret >= 0 && fabs(dx) < range) {
|
||||||
|
added_res += ret;
|
||||||
|
ret = find_nearest_n(dx <= 0.0 ? node->right : node->left, pos, range, num, heap, dim);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void kd_nearest_i(struct kdnode *node, const double *pos, struct kdnode **result, double *result_dist_sq, struct kdhyperrect* rect)
|
||||||
|
{
|
||||||
|
int dir = node->dir;
|
||||||
|
int i;
|
||||||
|
double dummy, dist_sq;
|
||||||
|
struct kdnode *nearer_subtree, *farther_subtree;
|
||||||
|
double *nearer_hyperrect_coord, *farther_hyperrect_coord;
|
||||||
|
|
||||||
|
/* Decide whether to go left or right in the tree */
|
||||||
|
dummy = pos[dir] - node->pos[dir];
|
||||||
|
if (dummy <= 0) {
|
||||||
|
nearer_subtree = node->left;
|
||||||
|
farther_subtree = node->right;
|
||||||
|
nearer_hyperrect_coord = rect->max + dir;
|
||||||
|
farther_hyperrect_coord = rect->min + dir;
|
||||||
|
} else {
|
||||||
|
nearer_subtree = node->right;
|
||||||
|
farther_subtree = node->left;
|
||||||
|
nearer_hyperrect_coord = rect->min + dir;
|
||||||
|
farther_hyperrect_coord = rect->max + dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nearer_subtree) {
|
||||||
|
/* Slice the hyperrect to get the hyperrect of the nearer subtree */
|
||||||
|
dummy = *nearer_hyperrect_coord;
|
||||||
|
*nearer_hyperrect_coord = node->pos[dir];
|
||||||
|
/* Recurse down into nearer subtree */
|
||||||
|
kd_nearest_i(nearer_subtree, pos, result, result_dist_sq, rect);
|
||||||
|
/* Undo the slice */
|
||||||
|
*nearer_hyperrect_coord = dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the distance of the point at the current node, compare it
|
||||||
|
* with our best so far */
|
||||||
|
dist_sq = 0;
|
||||||
|
for(i=0; i < rect->dim; i++) {
|
||||||
|
dist_sq += SQ(node->pos[i] - pos[i]);
|
||||||
|
}
|
||||||
|
if (dist_sq < *result_dist_sq) {
|
||||||
|
*result = node;
|
||||||
|
*result_dist_sq = dist_sq;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (farther_subtree) {
|
||||||
|
/* Get the hyperrect of the farther subtree */
|
||||||
|
dummy = *farther_hyperrect_coord;
|
||||||
|
*farther_hyperrect_coord = node->pos[dir];
|
||||||
|
/* Check if we have to recurse down by calculating the closest
|
||||||
|
* point of the hyperrect and see if it's closer than our
|
||||||
|
* minimum distance in result_dist_sq. */
|
||||||
|
if (hyperrect_dist_sq(rect, pos) < *result_dist_sq) {
|
||||||
|
/* Recurse down into farther subtree */
|
||||||
|
kd_nearest_i(farther_subtree, pos, result, result_dist_sq, rect);
|
||||||
|
}
|
||||||
|
/* Undo the slice on the hyperrect */
|
||||||
|
*farther_hyperrect_coord = dummy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest(struct kdtree *kd, const double *pos)
|
||||||
|
{
|
||||||
|
struct kdhyperrect *rect;
|
||||||
|
struct kdnode *result;
|
||||||
|
struct kdres *rset;
|
||||||
|
double dist_sq;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!kd) return 0;
|
||||||
|
if (!kd->rect) return 0;
|
||||||
|
|
||||||
|
/* Allocate result set */
|
||||||
|
if(!(rset = malloc(sizeof *rset))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(!(rset->rlist = alloc_resnode())) {
|
||||||
|
free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->rlist->next = 0;
|
||||||
|
rset->tree = kd;
|
||||||
|
|
||||||
|
/* Duplicate the bounding hyperrectangle, we will work on the copy */
|
||||||
|
if (!(rect = hyperrect_duplicate(kd->rect))) {
|
||||||
|
kd_res_free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Our first guesstimate is the root node */
|
||||||
|
result = kd->root;
|
||||||
|
dist_sq = 0;
|
||||||
|
for (i = 0; i < kd->dim; i++)
|
||||||
|
dist_sq += SQ(result->pos[i] - pos[i]);
|
||||||
|
|
||||||
|
/* Search for the nearest neighbour recursively */
|
||||||
|
kd_nearest_i(kd->root, pos, &result, &dist_sq, rect);
|
||||||
|
|
||||||
|
/* Free the copy of the hyperrect */
|
||||||
|
hyperrect_free(rect);
|
||||||
|
|
||||||
|
/* Store the result */
|
||||||
|
if (result) {
|
||||||
|
if (rlist_insert(rset->rlist, result, -1.0) == -1) {
|
||||||
|
kd_res_free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->size = 1;
|
||||||
|
kd_res_rewind(rset);
|
||||||
|
return rset;
|
||||||
|
} else {
|
||||||
|
kd_res_free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearestf(struct kdtree *tree, const float *pos)
|
||||||
|
{
|
||||||
|
static double sbuf[16];
|
||||||
|
double *bptr, *buf = 0;
|
||||||
|
int dim = tree->dim;
|
||||||
|
struct kdres *res;
|
||||||
|
|
||||||
|
if(dim > 16) {
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(dim <= 256)
|
||||||
|
bptr = buf = alloca(dim * sizeof *bptr);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if(!(bptr = buf = malloc(dim * sizeof *bptr))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bptr = buf = sbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(dim-- > 0) {
|
||||||
|
*bptr++ = *pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = kd_nearest(tree, buf);
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(tree->dim > 256)
|
||||||
|
#else
|
||||||
|
if(tree->dim > 16)
|
||||||
|
#endif
|
||||||
|
free(buf);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest3(struct kdtree *tree, double x, double y, double z)
|
||||||
|
{
|
||||||
|
double pos[3];
|
||||||
|
pos[0] = x;
|
||||||
|
pos[1] = y;
|
||||||
|
pos[2] = z;
|
||||||
|
return kd_nearest(tree, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z)
|
||||||
|
{
|
||||||
|
double pos[3];
|
||||||
|
pos[0] = x;
|
||||||
|
pos[1] = y;
|
||||||
|
pos[2] = z;
|
||||||
|
return kd_nearest(tree, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- nearest N search ---- */
|
||||||
|
/*
|
||||||
|
static kdres *kd_nearest_n(struct kdtree *kd, const double *pos, int num)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct kdres *rset;
|
||||||
|
|
||||||
|
if(!(rset = malloc(sizeof *rset))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(!(rset->rlist = alloc_resnode())) {
|
||||||
|
free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->rlist->next = 0;
|
||||||
|
rset->tree = kd;
|
||||||
|
|
||||||
|
if((ret = find_nearest_n(kd->root, pos, range, num, rset->rlist, kd->dim)) == -1) {
|
||||||
|
kd_res_free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->size = ret;
|
||||||
|
kd_res_rewind(rset);
|
||||||
|
return rset;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
struct kdres *kd_nearest_range(struct kdtree *kd, const double *pos, double range)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct kdres *rset;
|
||||||
|
|
||||||
|
if(!(rset = malloc(sizeof *rset))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(!(rset->rlist = alloc_resnode())) {
|
||||||
|
free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->rlist->next = 0;
|
||||||
|
rset->tree = kd;
|
||||||
|
|
||||||
|
if((ret = find_nearest(kd->root, pos, range, rset->rlist, 0, kd->dim)) == -1) {
|
||||||
|
kd_res_free(rset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rset->size = ret;
|
||||||
|
kd_res_rewind(rset);
|
||||||
|
return rset;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range)
|
||||||
|
{
|
||||||
|
static double sbuf[16];
|
||||||
|
double *bptr, *buf = 0;
|
||||||
|
int dim = kd->dim;
|
||||||
|
struct kdres *res;
|
||||||
|
|
||||||
|
if(dim > 16) {
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(dim <= 256)
|
||||||
|
bptr = buf = alloca(dim * sizeof *bptr);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if(!(bptr = buf = malloc(dim * sizeof *bptr))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bptr = buf = sbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(dim-- > 0) {
|
||||||
|
*bptr++ = *pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = kd_nearest_range(kd, buf, range);
|
||||||
|
#ifndef NO_ALLOCA
|
||||||
|
if(kd->dim > 256)
|
||||||
|
#else
|
||||||
|
if(kd->dim > 16)
|
||||||
|
#endif
|
||||||
|
free(buf);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest_range3(struct kdtree *tree, double x, double y, double z, double range)
|
||||||
|
{
|
||||||
|
double buf[3];
|
||||||
|
buf[0] = x;
|
||||||
|
buf[1] = y;
|
||||||
|
buf[2] = z;
|
||||||
|
return kd_nearest_range(tree, buf, range);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z, float range)
|
||||||
|
{
|
||||||
|
double buf[3];
|
||||||
|
buf[0] = x;
|
||||||
|
buf[1] = y;
|
||||||
|
buf[2] = z;
|
||||||
|
return kd_nearest_range(tree, buf, range);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kd_res_free(struct kdres *rset)
|
||||||
|
{
|
||||||
|
clear_results(rset);
|
||||||
|
free_resnode(rset->rlist);
|
||||||
|
free(rset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_res_size(struct kdres *set)
|
||||||
|
{
|
||||||
|
return (set->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kd_res_rewind(struct kdres *rset)
|
||||||
|
{
|
||||||
|
rset->riter = rset->rlist->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_res_end(struct kdres *rset)
|
||||||
|
{
|
||||||
|
return rset->riter == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kd_res_next(struct kdres *rset)
|
||||||
|
{
|
||||||
|
rset->riter = rset->riter->next;
|
||||||
|
return rset->riter != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *kd_res_item(struct kdres *rset, double *pos)
|
||||||
|
{
|
||||||
|
if(rset->riter) {
|
||||||
|
if(pos) {
|
||||||
|
memcpy(pos, rset->riter->item->pos, rset->tree->dim * sizeof *pos);
|
||||||
|
}
|
||||||
|
return rset->riter->item->data;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *kd_res_itemf(struct kdres *rset, float *pos)
|
||||||
|
{
|
||||||
|
if(rset->riter) {
|
||||||
|
if(pos) {
|
||||||
|
int i;
|
||||||
|
for(i=0; i<rset->tree->dim; i++) {
|
||||||
|
pos[i] = rset->riter->item->pos[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rset->riter->item->data;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *kd_res_item3(struct kdres *rset, double *x, double *y, double *z)
|
||||||
|
{
|
||||||
|
if(rset->riter) {
|
||||||
|
if(x) *x = rset->riter->item->pos[0];
|
||||||
|
if(y) *y = rset->riter->item->pos[1];
|
||||||
|
if(z) *z = rset->riter->item->pos[2];
|
||||||
|
return rset->riter->item->data;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *kd_res_item3f(struct kdres *rset, float *x, float *y, float *z)
|
||||||
|
{
|
||||||
|
if(rset->riter) {
|
||||||
|
if(x) *x = rset->riter->item->pos[0];
|
||||||
|
if(y) *y = rset->riter->item->pos[1];
|
||||||
|
if(z) *z = rset->riter->item->pos[2];
|
||||||
|
return rset->riter->item->data;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *kd_res_item_data(struct kdres *set)
|
||||||
|
{
|
||||||
|
return kd_res_item(set, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- hyperrectangle helpers ---- */
|
||||||
|
static struct kdhyperrect* hyperrect_create(int dim, const double *min, const double *max)
|
||||||
|
{
|
||||||
|
size_t size = dim * sizeof(double);
|
||||||
|
struct kdhyperrect* rect = 0;
|
||||||
|
|
||||||
|
if (!(rect = malloc(sizeof(struct kdhyperrect)))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rect->dim = dim;
|
||||||
|
if (!(rect->min = malloc(size))) {
|
||||||
|
free(rect);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!(rect->max = malloc(size))) {
|
||||||
|
free(rect->min);
|
||||||
|
free(rect);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memcpy(rect->min, min, size);
|
||||||
|
memcpy(rect->max, max, size);
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hyperrect_free(struct kdhyperrect *rect)
|
||||||
|
{
|
||||||
|
free(rect->min);
|
||||||
|
free(rect->max);
|
||||||
|
free(rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect)
|
||||||
|
{
|
||||||
|
return hyperrect_create(rect->dim, rect->min, rect->max);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hyperrect_extend(struct kdhyperrect *rect, const double *pos)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i < rect->dim; i++) {
|
||||||
|
if (pos[i] < rect->min[i]) {
|
||||||
|
rect->min[i] = pos[i];
|
||||||
|
}
|
||||||
|
if (pos[i] > rect->max[i]) {
|
||||||
|
rect->max[i] = pos[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double result = 0;
|
||||||
|
|
||||||
|
for (i=0; i < rect->dim; i++) {
|
||||||
|
if (pos[i] < rect->min[i]) {
|
||||||
|
result += SQ(rect->min[i] - pos[i]);
|
||||||
|
} else if (pos[i] > rect->max[i]) {
|
||||||
|
result += SQ(rect->max[i] - pos[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- static helpers ---- */
|
||||||
|
|
||||||
|
#ifdef USE_LIST_NODE_ALLOCATOR
|
||||||
|
/* special list node allocators. */
|
||||||
|
static struct res_node *free_nodes;
|
||||||
|
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
static pthread_mutex_t alloc_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct res_node *alloc_resnode(void)
|
||||||
|
{
|
||||||
|
struct res_node *node;
|
||||||
|
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
pthread_mutex_lock(&alloc_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(!free_nodes) {
|
||||||
|
node = malloc(sizeof *node);
|
||||||
|
} else {
|
||||||
|
node = free_nodes;
|
||||||
|
free_nodes = free_nodes->next;
|
||||||
|
node->next = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
pthread_mutex_unlock(&alloc_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free_resnode(struct res_node *node)
|
||||||
|
{
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
pthread_mutex_lock(&alloc_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
node->next = free_nodes;
|
||||||
|
free_nodes = node;
|
||||||
|
|
||||||
|
#ifndef NO_PTHREADS
|
||||||
|
pthread_mutex_unlock(&alloc_mutex);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* list node allocator or not */
|
||||||
|
|
||||||
|
|
||||||
|
/* inserts the item. if dist_sq is >= 0, then do an ordered insert */
|
||||||
|
/* TODO make the ordering code use heapsort */
|
||||||
|
static int rlist_insert(struct res_node *list, struct kdnode *item, double dist_sq)
|
||||||
|
{
|
||||||
|
struct res_node *rnode;
|
||||||
|
|
||||||
|
if(!(rnode = alloc_resnode())) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
rnode->item = item;
|
||||||
|
rnode->dist_sq = dist_sq;
|
||||||
|
|
||||||
|
if(dist_sq >= 0.0) {
|
||||||
|
while(list->next && list->next->dist_sq < dist_sq) {
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rnode->next = list->next;
|
||||||
|
list->next = rnode;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clear_results(struct kdres *rset)
|
||||||
|
{
|
||||||
|
struct res_node *tmp, *node = rset->rlist->next;
|
||||||
|
|
||||||
|
while(node) {
|
||||||
|
tmp = node;
|
||||||
|
node = node->next;
|
||||||
|
free_resnode(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
rset->rlist->next = 0;
|
||||||
|
}
|
||||||
129
kdtree/kdtree.h
Normal file
129
kdtree/kdtree.h
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
This file is part of ``kdtree'', a library for working with kd-trees.
|
||||||
|
Copyright (C) 2007-2011 John Tsiombikas <nuclear@member.fsf.org>
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef _KDTREE_H_
|
||||||
|
#define _KDTREE_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct kdtree;
|
||||||
|
struct kdres;
|
||||||
|
|
||||||
|
|
||||||
|
/* create a kd-tree for "k"-dimensional data */
|
||||||
|
struct kdtree *kd_create(int k);
|
||||||
|
|
||||||
|
/* free the struct kdtree */
|
||||||
|
void kd_free(struct kdtree *tree);
|
||||||
|
|
||||||
|
/* remove all the elements from the tree */
|
||||||
|
void kd_clear(struct kdtree *tree);
|
||||||
|
|
||||||
|
/* if called with non-null 2nd argument, the function provided
|
||||||
|
* will be called on data pointers (see kd_insert) when nodes
|
||||||
|
* are to be removed from the tree.
|
||||||
|
*/
|
||||||
|
void kd_data_destructor(struct kdtree *tree, void (*destr)(void*));
|
||||||
|
|
||||||
|
/* insert a node, specifying its position, and optional data */
|
||||||
|
int kd_insert(struct kdtree *tree, const double *pos, void *data);
|
||||||
|
int kd_insertf(struct kdtree *tree, const float *pos, void *data);
|
||||||
|
int kd_insert3(struct kdtree *tree, double x, double y, double z, void *data);
|
||||||
|
int kd_insert3f(struct kdtree *tree, float x, float y, float z, void *data);
|
||||||
|
|
||||||
|
/* Find the nearest node from a given point.
|
||||||
|
*
|
||||||
|
* This function returns a pointer to a result set with at most one element.
|
||||||
|
*/
|
||||||
|
struct kdres *kd_nearest(struct kdtree *tree, const double *pos);
|
||||||
|
struct kdres *kd_nearestf(struct kdtree *tree, const float *pos);
|
||||||
|
struct kdres *kd_nearest3(struct kdtree *tree, double x, double y, double z);
|
||||||
|
struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z);
|
||||||
|
|
||||||
|
/* Find the N nearest nodes from a given point.
|
||||||
|
*
|
||||||
|
* This function returns a pointer to a result set, with at most N elements,
|
||||||
|
* which can be manipulated with the kd_res_* functions.
|
||||||
|
* The returned pointer can be null as an indication of an error. Otherwise
|
||||||
|
* a valid result set is always returned which may contain 0 or more elements.
|
||||||
|
* The result set must be deallocated with kd_res_free after use.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
struct kdres *kd_nearest_n(struct kdtree *tree, const double *pos, int num);
|
||||||
|
struct kdres *kd_nearest_nf(struct kdtree *tree, const float *pos, int num);
|
||||||
|
struct kdres *kd_nearest_n3(struct kdtree *tree, double x, double y, double z);
|
||||||
|
struct kdres *kd_nearest_n3f(struct kdtree *tree, float x, float y, float z);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Find any nearest nodes from a given point within a range.
|
||||||
|
*
|
||||||
|
* This function returns a pointer to a result set, which can be manipulated
|
||||||
|
* by the kd_res_* functions.
|
||||||
|
* The returned pointer can be null as an indication of an error. Otherwise
|
||||||
|
* a valid result set is always returned which may contain 0 or more elements.
|
||||||
|
* The result set must be deallocated with kd_res_free after use.
|
||||||
|
*/
|
||||||
|
struct kdres *kd_nearest_range(struct kdtree *tree, const double *pos, double range);
|
||||||
|
struct kdres *kd_nearest_rangef(struct kdtree *tree, const float *pos, float range);
|
||||||
|
struct kdres *kd_nearest_range3(struct kdtree *tree, double x, double y, double z, double range);
|
||||||
|
struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z, float range);
|
||||||
|
|
||||||
|
/* frees a result set returned by kd_nearest_range() */
|
||||||
|
void kd_res_free(struct kdres *set);
|
||||||
|
|
||||||
|
/* returns the size of the result set (in elements) */
|
||||||
|
int kd_res_size(struct kdres *set);
|
||||||
|
|
||||||
|
/* rewinds the result set iterator */
|
||||||
|
void kd_res_rewind(struct kdres *set);
|
||||||
|
|
||||||
|
/* returns non-zero if the set iterator reached the end after the last element */
|
||||||
|
int kd_res_end(struct kdres *set);
|
||||||
|
|
||||||
|
/* advances the result set iterator, returns non-zero on success, zero if
|
||||||
|
* there are no more elements in the result set.
|
||||||
|
*/
|
||||||
|
int kd_res_next(struct kdres *set);
|
||||||
|
|
||||||
|
/* returns the data pointer (can be null) of the current result set item
|
||||||
|
* and optionally sets its position to the pointers(s) if not null.
|
||||||
|
*/
|
||||||
|
void *kd_res_item(struct kdres *set, double *pos);
|
||||||
|
void *kd_res_itemf(struct kdres *set, float *pos);
|
||||||
|
void *kd_res_item3(struct kdres *set, double *x, double *y, double *z);
|
||||||
|
void *kd_res_item3f(struct kdres *set, float *x, float *y, float *z);
|
||||||
|
|
||||||
|
/* equivalent to kd_res_item(set, 0) */
|
||||||
|
void *kd_res_item_data(struct kdres *set);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _KDTREE_H_ */
|
||||||
25826
nlohmann/json.hpp
Normal file
25826
nlohmann/json.hpp
Normal file
File diff suppressed because it is too large
Load Diff
176
src/cluster.h
Normal file
176
src/cluster.h
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
} Vector2;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int *indices;
|
||||||
|
int *indices_ordered;
|
||||||
|
Vector2 centroid; // In Meters.
|
||||||
|
double centroid_latitude; // In Degrees.
|
||||||
|
double centroid_longitude; // In Degrees.
|
||||||
|
double covariance[2][2];
|
||||||
|
double lambda1;
|
||||||
|
double lambda2;
|
||||||
|
double spread;
|
||||||
|
double elongation;
|
||||||
|
} Cluster;
|
||||||
|
void Cluster_OrderIndices(Location *locations, Cluster *cluster);
|
||||||
|
void Cluster_ComputeCentriod(Location *locations, Cluster *cluster);
|
||||||
|
void Cluster_ComputeCovariance(Location *locations, Cluster *cluster);
|
||||||
|
void Cluster_ComputeEigenvalues2D(Cluster *cluster);
|
||||||
|
void Cluster_Analyze(Location *locations, Cluster *cluster);
|
||||||
|
|
||||||
|
long Cluster_Duration(Location *locations, Cluster *cluster);
|
||||||
|
|
||||||
|
#ifdef CLUSTER_IMPLEMENTATION
|
||||||
|
|
||||||
|
void Cluster_ComputeCentriod(Location *locations, Cluster *cluster) {
|
||||||
|
double sx = 0.0, sy = 0.0;
|
||||||
|
double slatitude = 0.0, slongitude = 0.0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < arrlen(cluster->indices); ++i) {
|
||||||
|
sx += locations[cluster->indices[i]].latitude_meter;
|
||||||
|
sy += locations[cluster->indices[i]].longitude_meter;
|
||||||
|
|
||||||
|
slatitude += locations[cluster->indices[i]].latitude;
|
||||||
|
slongitude += locations[cluster->indices[i]].longitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster->centroid.x = sx / arrlen(cluster->indices);
|
||||||
|
cluster->centroid.y = sy / arrlen(cluster->indices);
|
||||||
|
|
||||||
|
cluster->centroid_latitude = slatitude / arrlen(cluster->indices);
|
||||||
|
cluster->centroid_longitude = slongitude / arrlen(cluster->indices);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cluster_ComputeCovariance(Location *locations, Cluster *cluster) {
|
||||||
|
double sxx = 0.0, syy = 0.0, sxy = 0.0;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(cluster->indices); ++i) {
|
||||||
|
double dx = locations[cluster->indices[i]].latitude_meter - cluster->centroid.x;
|
||||||
|
double dy = locations[cluster->indices[i]].longitude_meter - cluster->centroid.y;
|
||||||
|
|
||||||
|
sxx += dx * dx;
|
||||||
|
syy += dy * dy;
|
||||||
|
sxy += dx * dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster->covariance[0][0] = sxx / arrlen(locations);
|
||||||
|
cluster->covariance[1][1] = syy / arrlen(locations);
|
||||||
|
cluster->covariance[0][1] = cluster->covariance[1][0] = sxy / arrlen(locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cluster_ComputeEigenvalues2D(Cluster *cluster) {
|
||||||
|
double a = cluster->covariance[0][0];
|
||||||
|
double b = cluster->covariance[0][1];
|
||||||
|
double c = cluster->covariance[1][1];
|
||||||
|
|
||||||
|
double trace = a + c;
|
||||||
|
double det_term = sqrt((a - c)*(a - c) + 4.0*b*b);
|
||||||
|
|
||||||
|
cluster->lambda1 = 0.5*(trace+det_term);
|
||||||
|
cluster->lambda2 = 0.5*(trace-det_term);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cluster_Analyze(Location *locations, Cluster *cluster) {
|
||||||
|
//fprintf(stderr, "Cluster_OrderIndices...\n");
|
||||||
|
Cluster_OrderIndices (locations, cluster);
|
||||||
|
//fprintf(stderr, "Cluster_Duration...\n");
|
||||||
|
Cluster_Duration (locations, cluster);
|
||||||
|
//fprintf(stderr, "Cluster_ComputeCentriod...\n");
|
||||||
|
Cluster_ComputeCentriod (locations, cluster);
|
||||||
|
//fprintf(stderr, "Cluster_ComputeCovariance...\n");
|
||||||
|
Cluster_ComputeCovariance (locations, cluster);
|
||||||
|
//fprintf(stderr, "Cluster_ComputeEigenvalues2D...\n");
|
||||||
|
Cluster_ComputeEigenvalues2D(cluster);
|
||||||
|
|
||||||
|
cluster->spread = sqrt(cluster->lambda1 + cluster->lambda2);
|
||||||
|
cluster->elongation = (cluster->lambda2 > 1e-9)
|
||||||
|
? (cluster->lambda1 / cluster->lambda2)
|
||||||
|
: INFINITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int order_indices(const void *a, const void *b) {
|
||||||
|
const int ia = *(const int*)a;
|
||||||
|
const int ib = *(const int*)b;
|
||||||
|
if (ia < ib) return -1;
|
||||||
|
if (ia > ib) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cluster_OrderIndices(Location *locations, Cluster *cluster) {
|
||||||
|
size_t len = arrlen(cluster->indices);
|
||||||
|
arrsetlen(cluster->indices_ordered, len);
|
||||||
|
memcpy(cluster->indices_ordered, cluster->indices, len * sizeof(int));
|
||||||
|
|
||||||
|
qsort(cluster->indices_ordered, arrlen(cluster->indices_ordered), sizeof(int), order_indices);
|
||||||
|
|
||||||
|
//fprintf(stderr, "[");
|
||||||
|
//for (int i = 0; i < arrlen(cluster->indices_ordered); ++i) {
|
||||||
|
// fprintf(stderr, "%d,", cluster->indices_ordered[i]);
|
||||||
|
//}
|
||||||
|
////for (int i = 0; i < arrlen(indices); ++i) {
|
||||||
|
//// fprintf(stderr, "%d,", indices[i]);
|
||||||
|
////}
|
||||||
|
//fprintf(stderr, "]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
long Cluster_Duration(Location *locations, Cluster *cluster) {
|
||||||
|
if (arrlen(cluster->indices) == 0) return 0;
|
||||||
|
return locations[cluster->indices_ordered[arrlen(cluster->indices_ordered) - 1]].time_scaled - locations[cluster->indices_ordered[0]].time_scaled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cluster_LocationSampler(Location *locations, Cluster *clusters, Location **out, double *speed_max) {
|
||||||
|
int cluster_index = 0;
|
||||||
|
int n = 0;
|
||||||
|
int speed_max_location_index = 0;
|
||||||
|
for (int i = 0; i < arrlen(locations); ++i) {
|
||||||
|
Location location = locations[i];
|
||||||
|
if (location.stoped) {
|
||||||
|
//fprintf(stderr, "%d | %d | %d \n", i, cluster_index, arrlen(clusters[cluster_index].indices));
|
||||||
|
Cluster cluster = clusters[cluster_index];
|
||||||
|
if (arrlen(cluster.indices) == 0) {
|
||||||
|
cluster_index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Location last_location_in_cluster = locations[cluster.indices_ordered[arrlen(cluster.indices_ordered)-1]];
|
||||||
|
Location _location = {};
|
||||||
|
_location.longitude = cluster.centroid_longitude;
|
||||||
|
_location.latitude = cluster.centroid_latitude;
|
||||||
|
_location.altitude = location.altitude;
|
||||||
|
_location.speed = location.speed;
|
||||||
|
_location.bearing = location.bearing;
|
||||||
|
_location.stoped = true;
|
||||||
|
_location.stoped_time = Cluster_Duration(locations, &cluster);
|
||||||
|
_location.accuracy = location.accuracy;
|
||||||
|
_location.time = last_location_in_cluster.time;
|
||||||
|
_location.time_scaled = last_location_in_cluster.time_scaled;
|
||||||
|
|
||||||
|
//Location_Print(_location);
|
||||||
|
|
||||||
|
//fprintf(stderr, "%d Insert STOP location to array...| %d\n", i, cluster.indices_ordered[arrlen(cluster.indices_ordered) - 1]+1);
|
||||||
|
//fprintf(stderr, "arrlen(cluster): %d\n", arrlen(clusters));
|
||||||
|
//fprintf(stderr, "arrlen(cluster.indices_ordered): %d\n", arrlen(cluster.indices_ordered));
|
||||||
|
arrput(*out, _location);
|
||||||
|
n++;
|
||||||
|
i = cluster.indices_ordered[arrlen(cluster.indices_ordered) - 1]+1;
|
||||||
|
cluster_index++;
|
||||||
|
} else {
|
||||||
|
//fprintf(stderr, "%d Insert location to array...\n", i);
|
||||||
|
//fprintf(stderr, "Speed: %lf | %lf\n", location.speed, *speed_max);
|
||||||
|
if (*speed_max < location.speed) {
|
||||||
|
*speed_max = location.speed;
|
||||||
|
speed_max_location_index = n;
|
||||||
|
}
|
||||||
|
arrput(*out, location);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(*out)[speed_max_location_index].always_keep = true;
|
||||||
|
Location_Print((*out)[speed_max_location_index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
106
src/config.h
Normal file
106
src/config.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#pragma once
|
||||||
|
typedef struct {
|
||||||
|
double tdbscan_eps_time;
|
||||||
|
double tdbscan_k;
|
||||||
|
int tdbscan_min_pts;
|
||||||
|
|
||||||
|
double douglas_eps;
|
||||||
|
double douglas_base;
|
||||||
|
double douglas_k;
|
||||||
|
|
||||||
|
std::string osrm_path;
|
||||||
|
} Config;
|
||||||
|
|
||||||
|
Config config_global;
|
||||||
|
|
||||||
|
void inline fatal(std::string message) {
|
||||||
|
fprintf(stderr, "Fatal: %s\n", message.c_str());
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TOML_TABLE(var, name) \
|
||||||
|
auto var = result.table->getTable(name); \
|
||||||
|
if (!var) fatal("Missing [" name "]"); \
|
||||||
|
|
||||||
|
#define TOML_GET_DOUBLE(var, name, out) \
|
||||||
|
auto [ok_##out, out] = var->getDouble(name); \
|
||||||
|
if (!ok_##out) fatal("Missing " name) \
|
||||||
|
|
||||||
|
#define TOML_GET_INT(var, name, out) \
|
||||||
|
auto [ok_##out, out] = var->getInt(name); \
|
||||||
|
if (!ok_##out) fatal("Missing " name) \
|
||||||
|
|
||||||
|
#define TOML_GET_STRING(var, name, out) \
|
||||||
|
auto [ok_##out, out] = var->getString(name); \
|
||||||
|
if (!ok_##out) fatal("Missing " name) \
|
||||||
|
|
||||||
|
#include "../tomlcpp/tomlcpp.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
|
||||||
|
#define NOMINMAX
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#elif defined(__linux__)
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
|
||||||
|
#include <mach-o/dyld.h>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::filesystem::path executable_dir() {
|
||||||
|
#if defined(_WIN32)
|
||||||
|
char buffer[MAX_PATH];
|
||||||
|
GetModuleFileNameA(NULL, buffer, MAX_PATH);
|
||||||
|
return std::filesystem::path(buffer).parent_path();
|
||||||
|
|
||||||
|
#elif defined(__linux__)
|
||||||
|
char buffer[1024];
|
||||||
|
ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer)-1);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
return std::filesystem::path(buffer).parent_path();
|
||||||
|
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
char buffer[1024];
|
||||||
|
uint32_t size = sizeof(buffer);
|
||||||
|
_NSGetExecutablePath(buffer, &size);
|
||||||
|
return std::filesystem::path(buffer).parent_path();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Config_Init(Config *config) {
|
||||||
|
auto config_path = executable_dir() / "config.toml";
|
||||||
|
auto result = toml:: parseFile(config_path.u8string());
|
||||||
|
if (!result.table) fatal("Cannot parse file: " + result.errmsg);
|
||||||
|
|
||||||
|
TOML_TABLE(tdbscan, "T-DBSCAN");
|
||||||
|
TOML_GET_DOUBLE(tdbscan, "eps_time", tdbscan_eps_time);
|
||||||
|
TOML_GET_DOUBLE(tdbscan, "k" , tdbscan_k);
|
||||||
|
TOML_GET_INT (tdbscan, "min_pts" , tdbscan_min_pts);
|
||||||
|
|
||||||
|
TOML_TABLE(douglas, "Douglas");
|
||||||
|
TOML_GET_DOUBLE(douglas, "eps" , douglas_eps);
|
||||||
|
TOML_GET_DOUBLE(douglas, "base", douglas_base);
|
||||||
|
TOML_GET_DOUBLE(douglas, "k" , douglas_k);
|
||||||
|
|
||||||
|
TOML_TABLE(osrm, "OSRM");
|
||||||
|
TOML_GET_STRING(osrm, "path", osrm_path);
|
||||||
|
|
||||||
|
config->tdbscan_eps_time = tdbscan_eps_time;
|
||||||
|
config->tdbscan_k = tdbscan_k;
|
||||||
|
config->tdbscan_min_pts = tdbscan_min_pts;
|
||||||
|
|
||||||
|
config->douglas_eps = douglas_eps;
|
||||||
|
config->douglas_base = douglas_base;
|
||||||
|
config->douglas_k = douglas_k;
|
||||||
|
|
||||||
|
config->osrm_path = osrm_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Config_Print(Config config) {
|
||||||
|
fprintf(stderr, "Config { tdbscan_eps_time = %f, tdbscan_k = %f, tdbscan_min_pts = %d, douglas_eps = %f, douglas_base = %f, douglas_k = %f, osrm_path = %s }\n", config.tdbscan_eps_time, config.tdbscan_k, config.tdbscan_min_pts, config.douglas_eps, config.douglas_base, config.douglas_k, config.osrm_path.c_str());
|
||||||
|
}
|
||||||
63
src/douglas_peucker.h
Normal file
63
src/douglas_peucker.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
double DP_PerpendicularDistance(Location p, Location a, Location b) {
|
||||||
|
double dx = b.longitude_meter - a.longitude_meter;
|
||||||
|
double dy = b.latitude_meter - a.latitude_meter;
|
||||||
|
|
||||||
|
if (dx == 0 && dy == 0) {
|
||||||
|
dx = p.longitude_meter - a.longitude_meter;
|
||||||
|
dy = p.latitude_meter - a.latitude_meter;
|
||||||
|
return sqrt(dx*dx + dy*dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
double numerator = fabs(dy*p.longitude_meter - dx*p.latitude_meter + b.longitude_meter*a.latitude_meter - b.latitude_meter*a.longitude_meter);
|
||||||
|
double denominator = sqrt(dx*dx + dy*dy);
|
||||||
|
return numerator / denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DP_Douglas_Peucker(Location *locations, size_t start, size_t end, double epsilon, bool *keep) {
|
||||||
|
|
||||||
|
if (end <= start + 1) return;
|
||||||
|
|
||||||
|
double max_dist = 0.0;
|
||||||
|
size_t index = -1;
|
||||||
|
|
||||||
|
for (size_t i = start + 1; i < end; ++i) {
|
||||||
|
double distance = DP_PerpendicularDistance(locations[i], locations[start], locations[end]);
|
||||||
|
if (distance > max_dist) {
|
||||||
|
max_dist = distance;
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double eps = epsilon;
|
||||||
|
if (eps == -1) {
|
||||||
|
double speed_avg = (locations[start].speed + locations[end].speed) / 2;
|
||||||
|
double base = config_global.douglas_base;
|
||||||
|
double k = config_global.douglas_k;
|
||||||
|
eps = base + speed_avg*k;
|
||||||
|
}
|
||||||
|
if (max_dist > eps) {
|
||||||
|
keep[index] = true;
|
||||||
|
DP_Douglas_Peucker(locations, start, index, epsilon, keep);
|
||||||
|
DP_Douglas_Peucker(locations, index, end , epsilon, keep);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t DP_Simplify(Location *locations, double epsilon, Location **out) {
|
||||||
|
size_t n = arrlen(locations);
|
||||||
|
bool *keep = (bool *) calloc(n, sizeof(size_t));
|
||||||
|
keep[0] = true;
|
||||||
|
keep[n - 1] = true;
|
||||||
|
|
||||||
|
DP_Douglas_Peucker(locations, 0, arrlen(locations), epsilon, keep);
|
||||||
|
|
||||||
|
size_t out_count = 0;
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
if (keep[i] || locations[i].stoped || locations[i].always_keep) {
|
||||||
|
arrput(*out, locations[i]);
|
||||||
|
out_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out_count;
|
||||||
|
}
|
||||||
245
src/location.h
Normal file
245
src/location.h
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
static int order_timestamp(const void *a, const void *b);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double latitude;
|
||||||
|
double longitude;
|
||||||
|
double altitude;
|
||||||
|
double latitude_meter;
|
||||||
|
double longitude_meter;
|
||||||
|
double speed; // Meters per Second.
|
||||||
|
double bearing;
|
||||||
|
double accuracy;
|
||||||
|
bool stoped;
|
||||||
|
long long stoped_time;
|
||||||
|
long long time;
|
||||||
|
long long time_scaled;
|
||||||
|
bool always_keep;
|
||||||
|
} Location;
|
||||||
|
|
||||||
|
void to_json(nlohmann::json& j, const Location& l) {
|
||||||
|
j = nlohmann::json{
|
||||||
|
{ "latitude" , l.latitude },
|
||||||
|
{ "longitude" , l.longitude },
|
||||||
|
{ "accuracy" , l.accuracy },
|
||||||
|
{ "speed" , l.speed },
|
||||||
|
{ "stoped" , l.stoped },
|
||||||
|
{ "stoped_time" , l.stoped_time },
|
||||||
|
{ "time" , l.time },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert stb Location array to JSON array
|
||||||
|
nlohmann::json locations_to_json(Location* locations) {
|
||||||
|
nlohmann::json j = nlohmann::json::array();
|
||||||
|
for (int i = 0; i < arrlen(locations); i++) {
|
||||||
|
j.push_back(locations[i]); // Uses to_json
|
||||||
|
}
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double latitude;
|
||||||
|
double longitude;
|
||||||
|
long long datetime;
|
||||||
|
long long time_stoped;
|
||||||
|
char datetime_str[20];
|
||||||
|
char time_str[9];
|
||||||
|
} Location_Stop;
|
||||||
|
|
||||||
|
inline Location_Stop Location_Stop_Init(Location l) {
|
||||||
|
Location_Stop ls = {l.latitude, l.longitude, l.time, l.stoped_time, "", ""};
|
||||||
|
Time_ConvertSecondsToHMS(l.stoped_time, ls.time_str );
|
||||||
|
Time_UnixToHMS (l.time/1000, ls.datetime_str);
|
||||||
|
return ls;
|
||||||
|
}
|
||||||
|
|
||||||
|
void to_json(nlohmann::json& j, const Location_Stop& s) {
|
||||||
|
j = nlohmann::json{
|
||||||
|
{ "latitude" , s.latitude },
|
||||||
|
{ "longitude" , s.longitude },
|
||||||
|
{ "duration" , s.time_stoped },
|
||||||
|
{ "duration_str", s.time_str },
|
||||||
|
{ "datetime" , s.datetime },
|
||||||
|
{ "datetime_str", s.datetime_str },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double latitude_start;
|
||||||
|
double longitude_start;
|
||||||
|
double latitude_end;
|
||||||
|
double longitude_end;
|
||||||
|
long long datetime_start;
|
||||||
|
long long datetime_end;
|
||||||
|
long long duration;
|
||||||
|
char datetime_start_str[20];
|
||||||
|
char datetime_end_str [20];
|
||||||
|
char duration_str [9];
|
||||||
|
double distance_traveled;
|
||||||
|
double speed_max;
|
||||||
|
} Location_Trajectory;
|
||||||
|
|
||||||
|
inline Location_Trajectory Location_Trajectory_Init(double lat_start, double lon_start, double lat_end, double lon_end, long long datetime_start, long long datetime_end, double distance_traveled, double speed_max) {
|
||||||
|
|
||||||
|
Location_Trajectory lt = {
|
||||||
|
lat_start,
|
||||||
|
lon_start,
|
||||||
|
lat_end,
|
||||||
|
lon_end,
|
||||||
|
datetime_start/ 1000,
|
||||||
|
datetime_end / 1000,
|
||||||
|
(datetime_end - datetime_start) / 1000,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
distance_traveled,
|
||||||
|
speed_max
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Time_UnixToHMS(lt.datetime_start, lt.datetime_start_str);
|
||||||
|
Time_UnixToHMS(lt.datetime_end , lt.datetime_end_str );
|
||||||
|
Time_ConvertSecondsToHMS(lt.duration, lt.duration_str );
|
||||||
|
|
||||||
|
return lt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void to_json(nlohmann::json& j, const Location_Trajectory& l) {
|
||||||
|
j = nlohmann::json{
|
||||||
|
{ "latitude_start" , l.latitude_start },
|
||||||
|
{ "longitude_start", l.longitude_start },
|
||||||
|
|
||||||
|
{ "latitude_end" , l.latitude_end },
|
||||||
|
{ "longitude_end" , l.longitude_end },
|
||||||
|
|
||||||
|
{ "datetime_start" , l.datetime_start },
|
||||||
|
{ "datetime_end" , l.datetime_end },
|
||||||
|
|
||||||
|
{ "duration" , l.duration },
|
||||||
|
|
||||||
|
{ "datetime_start_str", l.datetime_start_str },
|
||||||
|
{ "datetime_end_str" , l.datetime_end_str },
|
||||||
|
{ "duration_str" , l.duration_str },
|
||||||
|
|
||||||
|
{ "distance_traveled", l.distance_traveled },
|
||||||
|
|
||||||
|
{ "speed_max", l.speed_max }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double accuracy_median;
|
||||||
|
double accuracy_p75;
|
||||||
|
double accuracy_p90;
|
||||||
|
} Location_GeneralData;
|
||||||
|
|
||||||
|
|
||||||
|
static int order_double(const void *a, const void *b);
|
||||||
|
|
||||||
|
Location_GeneralData location_generalData = {0};
|
||||||
|
//
|
||||||
|
// @Todo: Make it inline function... ~ H.Hamza Zakaria - 2026-01-28.
|
||||||
|
void Location_Print(Location l) {
|
||||||
|
fprintf(
|
||||||
|
stderr,
|
||||||
|
"Location.{%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lld, %lld, %d, %lld}\n",
|
||||||
|
l.latitude,
|
||||||
|
l.longitude,
|
||||||
|
l.latitude_meter,
|
||||||
|
l.longitude_meter,
|
||||||
|
l.speed,
|
||||||
|
l.bearing,
|
||||||
|
l.accuracy,
|
||||||
|
l.time,
|
||||||
|
l.time_scaled,
|
||||||
|
l.stoped,
|
||||||
|
l.stoped_time
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void Location_Prints(Location *locations) {
|
||||||
|
for (int i = 0; i < arrlen(locations); ++i) {
|
||||||
|
Location l = locations[i];
|
||||||
|
Location_Print(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define deg2rad(deg) (deg * (3.14159265359/180))
|
||||||
|
size_t Location_ReadStandardInput(Location **locations) {
|
||||||
|
char buffer[256];
|
||||||
|
|
||||||
|
bool is_init = false;
|
||||||
|
double lat0, lon0, lat0_rad;
|
||||||
|
long time0;
|
||||||
|
|
||||||
|
double *accuracies = NULL;
|
||||||
|
|
||||||
|
// Read from stdinput, data format is `latitude,longitude,time`
|
||||||
|
// latitude and longitude ar ein degrees, time in unix timestamp.
|
||||||
|
int i = 0;
|
||||||
|
while (fgets(buffer, sizeof(buffer), stdin)) {
|
||||||
|
double lat, lon, alt, acc, speed, bearing;
|
||||||
|
long long ts;
|
||||||
|
if (sscanf(buffer, "%lf,%lf,%lf,%lf,%lf,%lf,%lld", &lat, &lon, &alt, &acc, &speed, &bearing, &ts) == 7) {
|
||||||
|
// We will need these values to convert to meters, and to scale time properlly.
|
||||||
|
if (!is_init) {
|
||||||
|
lat0 = lat;
|
||||||
|
lon0 = lon;
|
||||||
|
time0 = ts;
|
||||||
|
lat0_rad = deg2rad(lat0);
|
||||||
|
is_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert longitude and latitude to meters.
|
||||||
|
double lon_m = (lon - lon0) * 111320 * cos(lat0_rad);
|
||||||
|
double lat_m = (lat - lat0) * 111320;
|
||||||
|
long long t = (ts - time0) / 1000; // Convert Unix Time to Relative seconds.
|
||||||
|
|
||||||
|
Location location = {lat, lon, alt, lat_m, lon_m, speed, bearing, acc, false, 0, ts, t};
|
||||||
|
arrput(*locations, location);
|
||||||
|
arrput(accuracies, acc);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Bad line: %s", buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort(accuracies, arrlen(accuracies), sizeof(accuracies), order_double);
|
||||||
|
location_generalData.accuracy_median = accuracies[(int)(arrlen(accuracies) / 2)];
|
||||||
|
location_generalData.accuracy_p75 = accuracies[(int)(arrlen(accuracies)*0.75)];
|
||||||
|
location_generalData.accuracy_p90 = accuracies[(int)(arrlen(accuracies)*0.90)];
|
||||||
|
|
||||||
|
return arrlen(*locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Location_OrderByTimestamp(Location *locations) {
|
||||||
|
qsort(locations, arrlen(locations), sizeof(Location), order_timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Location_RemoveOutOfOrder(Location *locations) {
|
||||||
|
size_t len = arrlen(locations);
|
||||||
|
if (len == 0) return;
|
||||||
|
for (size_t i = len - 1; i > 0; --i) {
|
||||||
|
if (locations[i].time_scaled < locations[i - 1].time_scaled) {
|
||||||
|
Location_Print(locations[i]);
|
||||||
|
arrdel(locations, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int order_timestamp(const void *a, const void *b) {
|
||||||
|
const Location *la = (const Location*) a;
|
||||||
|
const Location *lb = (const Location*) b;
|
||||||
|
if (la->time_scaled < lb->time_scaled) return -1;
|
||||||
|
if (la->time_scaled > lb->time_scaled) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int order_double(const void *a, const void *b) {
|
||||||
|
const double da = *(const double*) a;
|
||||||
|
const double db = *(const double*) b;
|
||||||
|
if (da < db) return -1;
|
||||||
|
if (da > db) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
175
src/main.cpp
Normal file
175
src/main.cpp
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstdbool>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <osrm/osrm.hpp>
|
||||||
|
#include <osrm/engine_config.hpp>
|
||||||
|
#include <osrm/storage_config.hpp>
|
||||||
|
#include <osrm/engine/api/match_parameters.hpp>
|
||||||
|
#include <osrm/json_container.hpp>
|
||||||
|
#include <util/json_renderer.hpp>
|
||||||
|
#include <fstream>
|
||||||
|
#include <engine/polyline_compressor.hpp>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
#include "../nlohmann/json.hpp"
|
||||||
|
|
||||||
|
#define STB_DS_IMPLEMENTATION
|
||||||
|
#include "../stb/stb_ds.h"
|
||||||
|
|
||||||
|
#include "../kdtree/kdtree.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "time_utils.h"
|
||||||
|
#include "location.h"
|
||||||
|
#define CLUSTER_IMPLEMENTATION
|
||||||
|
#include "cluster.h"
|
||||||
|
#include "t_dbscan.h"
|
||||||
|
|
||||||
|
using namespace osrm;
|
||||||
|
#include "osrm_helper.h"
|
||||||
|
|
||||||
|
#include "douglas_peucker.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
#define DEBUG
|
||||||
|
|
||||||
|
struct kdtree *tree;
|
||||||
|
Location *locations;
|
||||||
|
Cluster *clusters;
|
||||||
|
|
||||||
|
int KdTree2D_Init(struct kdtree **tree, Location *locations) {
|
||||||
|
// Create 2-Dimentional KD-Tree.
|
||||||
|
*tree = kd_create(2);
|
||||||
|
|
||||||
|
// Populating KD-Tree.
|
||||||
|
for (size_t i = 0; i < arrlen(locations); ++i) {
|
||||||
|
Location location = locations[i];
|
||||||
|
double location_as_array[] = {location.latitude_meter, location.longitude_meter};
|
||||||
|
assert(kd_insert(*tree, location_as_array, (void*)i) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> geometries_from_routes;
|
||||||
|
std::vector<std::string> geometries_from_matches;
|
||||||
|
std::vector<Location_Stop> stops;
|
||||||
|
|
||||||
|
EngineConfig config;
|
||||||
|
MatchParameters match_parameters;
|
||||||
|
RouteParameters route_parameters;
|
||||||
|
|
||||||
|
double distance_traveled = 0.0;
|
||||||
|
double speed_max = 0.0;
|
||||||
|
int main() {
|
||||||
|
Config_Init(&config_global);
|
||||||
|
simple_timer timer;
|
||||||
|
timer_start(&timer);
|
||||||
|
EngineConfig_Init(&config);
|
||||||
|
OSRM osrm{config};
|
||||||
|
|
||||||
|
MatchParameters_Init(&match_parameters);
|
||||||
|
RouteParameters_Init(&route_parameters);
|
||||||
|
|
||||||
|
size_t location_len = Location_ReadStandardInput(&locations);
|
||||||
|
if (location_len == 0) {
|
||||||
|
fprintf(stderr, "EXAMPLE USAGE\n");
|
||||||
|
// TOOD: EXAMPLE USAGE.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
KdTree2D_Init(&tree, locations);
|
||||||
|
int n_clusters = T_DBSCAN(tree, locations, 35, config_global.tdbscan_eps_time, config_global.tdbscan_min_pts, &clusters);
|
||||||
|
for (size_t i = 0; i < n_clusters; ++i) {
|
||||||
|
Cluster_Analyze(locations, &clusters[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Location *sampled_locations = NULL;
|
||||||
|
Cluster_LocationSampler(locations, clusters, &sampled_locations, &speed_max);
|
||||||
|
Location *downsampled_locations = NULL;
|
||||||
|
size_t downsampled_locations_len = DP_Simplify(sampled_locations, config_global.douglas_eps, &downsampled_locations);
|
||||||
|
|
||||||
|
Location_RemoveOutOfOrder(downsampled_locations);
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "Locations %d | Sampled Locations %d | Down Sampled: %d\n", arrlen(locations), arrlen(sampled_locations), arrlen(downsampled_locations));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
long long datetime_start = downsampled_locations[0].time;
|
||||||
|
long long datetime_end = downsampled_locations[arrlen(downsampled_locations) - 1].time;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < arrlen(downsampled_locations); ++i) {
|
||||||
|
Location location = downsampled_locations[i];
|
||||||
|
MatchParameters_Add(&match_parameters, location);
|
||||||
|
if (location.stoped) {
|
||||||
|
Location_Stop ls = Location_Stop_Init(location);
|
||||||
|
stops.push_back(ls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
json::Object result;
|
||||||
|
auto status = osrm.Match(match_parameters, result);
|
||||||
|
if (status != Status::Ok) {
|
||||||
|
std::string output;
|
||||||
|
json::render(output, result);
|
||||||
|
fprintf(stderr, "Match as Failed!\noutput: %s\n", output.c_str());
|
||||||
|
for (size_t i = 0; i < arrlen(downsampled_locations); ++i) {
|
||||||
|
Location_Print(downsampled_locations[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Geometry_Add(geometries_from_matches, &distance_traveled, result, "matchings");
|
||||||
|
nlohmann::json geometries_from_matches_json = geometries_from_matches;
|
||||||
|
|
||||||
|
size_t len = geometries_from_matches.size();
|
||||||
|
size_t number_of_gaps = len - 1;
|
||||||
|
|
||||||
|
auto start_of_trajectory_coord = osrm::engine::decodePolyline(geometries_from_matches.front()).front();
|
||||||
|
auto end_of_trajectory_coord = osrm::engine::decodePolyline(geometries_from_matches.back()).back();
|
||||||
|
|
||||||
|
|
||||||
|
for (size_t i = 0; i <= number_of_gaps; ++i) {
|
||||||
|
if (i == 0) continue;
|
||||||
|
const auto start = osrm::engine::decodePolyline(geometries_from_matches[i-1]).back();
|
||||||
|
const auto end = osrm::engine::decodePolyline(geometries_from_matches[i] ).front();
|
||||||
|
|
||||||
|
RouteParameters_RouteGaps(&osrm, &route_parameters, geometries_from_routes, &distance_traveled, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
Location_Trajectory trajectory = Location_Trajectory_Init(
|
||||||
|
static_cast<double>(util::toFloating(start_of_trajectory_coord.lat)),
|
||||||
|
static_cast<double>(util::toFloating(start_of_trajectory_coord.lon)),
|
||||||
|
static_cast<double>(util::toFloating(end_of_trajectory_coord.lat)),
|
||||||
|
static_cast<double>(util::toFloating(end_of_trajectory_coord.lon)),
|
||||||
|
datetime_start,
|
||||||
|
datetime_end ,
|
||||||
|
distance_traveled,
|
||||||
|
speed_max
|
||||||
|
);
|
||||||
|
|
||||||
|
nlohmann::json trajectory_json = trajectory;
|
||||||
|
|
||||||
|
nlohmann::json geometries_from_routes_json = geometries_from_routes;
|
||||||
|
nlohmann::json stops_json = stops;
|
||||||
|
|
||||||
|
nlohmann::json final_json = {
|
||||||
|
{ "trajectory", trajectory_json },
|
||||||
|
{ "matches" , geometries_from_matches },
|
||||||
|
{ "routes" , geometries_from_routes },
|
||||||
|
{ "stops" , stops },
|
||||||
|
{ "records" , locations_to_json(downsampled_locations) }
|
||||||
|
};
|
||||||
|
|
||||||
|
fprintf(stdout, "%s\n", final_json.dump().c_str());
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "Entire Process took: %f sec\n", timer_elapsed(&timer));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Config_Print(config_global);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
src/main.obj
Normal file
BIN
src/main.obj
Normal file
Binary file not shown.
67
src/osrm_helper.h
Normal file
67
src/osrm_helper.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
inline void EngineConfig_Init(EngineConfig *config) {
|
||||||
|
//config->storage_config = StorageConfig("C:\\Users\\TRIZ\\clones\\osrm_test\\data\\algeria-260108.osrm");
|
||||||
|
config->storage_config = StorageConfig(config_global.osrm_path);
|
||||||
|
config->use_shared_memory = false;
|
||||||
|
config->algorithm = EngineConfig::Algorithm::CH; // This needs osrm-extract and osrm-contract, for MLD you need osrm-extract osrm-partition osrm-customize.
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void MatchParameters_Init(MatchParameters *params) {
|
||||||
|
params->steps = false;
|
||||||
|
params->annotations = false;
|
||||||
|
params->tidy = true;
|
||||||
|
params->overview = RouteParameters::OverviewType::Full;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void MatchParameters_Add(MatchParameters *params, Location l) {
|
||||||
|
double radius = std::max(l.accuracy * 1.2, 8.0);
|
||||||
|
params->coordinates.push_back({util::FloatLongitude{l.longitude}, util::FloatLatitude{l.latitude}});
|
||||||
|
params->timestamps .push_back(l.time);
|
||||||
|
params->radiuses .push_back(radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void RouteParameters_Init(RouteParameters *params) {
|
||||||
|
params->overview = RouteParameters::OverviewType::Full;
|
||||||
|
//params.alternatives = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Geometry_Add(std::vector<std::string>& geometries, double *distance, json::Object json_object, std::string key) {
|
||||||
|
assert(key == "routes" || key == "matchings");
|
||||||
|
|
||||||
|
if (json_object.values.find(key) == json_object.values.end()) return;
|
||||||
|
|
||||||
|
auto& routes = std::get<osrm::json::Array>(json_object.values[key]);
|
||||||
|
if (routes.values.empty()) return;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < routes.values.size(); ++i) {
|
||||||
|
auto& route = std::get<osrm::json::Object>(routes.values[i]);
|
||||||
|
if (route.values.find("geometry") == route.values.end()) return;
|
||||||
|
// Correct way to get distance
|
||||||
|
auto distance_it = route.values.find("distance");
|
||||||
|
if (distance_it != route.values.end()) {
|
||||||
|
*distance += std::get<osrm::json::Number>(distance_it->second).value;
|
||||||
|
//fprintf(stderr, "Distance %f\n", *distance);
|
||||||
|
}
|
||||||
|
auto& geometry = std::get<osrm::util::json::String>(route.values["geometry"]);
|
||||||
|
geometries.push_back(geometry.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RouteParameters_RouteGaps(OSRM *osrm, RouteParameters *params, std::vector<std::string> &geometries_from_routes, double *distance_traveled, util::Coordinate start, util::Coordinate end) {
|
||||||
|
params->coordinates.clear();
|
||||||
|
params->coordinates.push_back(start);
|
||||||
|
params->coordinates.push_back(end);
|
||||||
|
|
||||||
|
json::Object result;
|
||||||
|
auto status = osrm->Route(*params, result);
|
||||||
|
|
||||||
|
if (status != Status::Ok) {
|
||||||
|
std::string output;
|
||||||
|
json::render(output, result);
|
||||||
|
fprintf(stderr, "Route has Failed!\noutput: %s\n", output.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Geometry_Add(geometries_from_routes, distance_traveled, result, "routes");
|
||||||
|
}
|
||||||
116
src/t_dbscan.h
Normal file
116
src/t_dbscan.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
size_t index;
|
||||||
|
double distance;
|
||||||
|
} Match;
|
||||||
|
|
||||||
|
static int compare_cluster_size(const void *a, const void *b) {
|
||||||
|
const Cluster *ca = (const Cluster*)a;
|
||||||
|
const Cluster *cb = (const Cluster*)b;
|
||||||
|
return (int)arrlen(cb->indices) - (int)arrlen(ca->indices);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define ADAPTIVE_EPS
|
||||||
|
|
||||||
|
|
||||||
|
void T_DBSCAN_RadiusSearchFiltered_ForStop(struct kdtree *tree, Location *locations, int center_index, double eps_time, Match **out_matches) {
|
||||||
|
double pos[2] = { locations[center_index].latitude_meter, locations[center_index].longitude_meter };
|
||||||
|
|
||||||
|
double k = 3.0;
|
||||||
|
double eps_stop = location_generalData.accuracy_median*k;
|
||||||
|
struct kdres *res = kd_nearest_range(tree, pos, eps_stop);
|
||||||
|
|
||||||
|
while (!kd_res_end(res)) {
|
||||||
|
int index = (int)(intptr_t) kd_res_item_data(res);
|
||||||
|
double dx = locations[index].latitude_meter - locations[center_index].latitude_meter;
|
||||||
|
double dy = locations[index].longitude_meter - locations[center_index].longitude_meter;
|
||||||
|
double distance = sqrt(dx*dx + dy*dy);
|
||||||
|
|
||||||
|
if (fabs(locations[index].time_scaled - locations[center_index].time_scaled) <= eps_time && locations[center_index].speed < 0.7) {
|
||||||
|
Match m = {index, distance};
|
||||||
|
arrput(*out_matches, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
kd_res_next(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
kd_res_free(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_DBSCAN_RadiusSearchFiltered(struct kdtree *tree, Location *locations, int center_index, double eps, double eps_time, Match **out_matches) {
|
||||||
|
|
||||||
|
double pos[2] = { locations[center_index].latitude_meter, locations[center_index].longitude_meter };
|
||||||
|
|
||||||
|
#ifdef ADAPTIVE_EPS
|
||||||
|
double k = 2.5;
|
||||||
|
double adaptive_eps = locations[center_index].speed*locations[center_index].time_scaled + locations[center_index].accuracy*k;
|
||||||
|
struct kdres *res = kd_nearest_range(tree, pos, adaptive_eps);
|
||||||
|
#else
|
||||||
|
double k = 3.0;
|
||||||
|
double eps_stop = locations[center_index].accuracy*config_global.tdbscan_k;
|
||||||
|
struct kdres *res = kd_nearest_range(tree, pos, eps_stop);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (!kd_res_end(res)) {
|
||||||
|
int index = (int)(intptr_t) kd_res_item_data(res);
|
||||||
|
double dx = locations[index].latitude_meter - locations[center_index].latitude_meter;
|
||||||
|
double dy = locations[index].longitude_meter - locations[center_index].longitude_meter;
|
||||||
|
double distance = sqrt(dx*dx + dy*dy);
|
||||||
|
|
||||||
|
if (fabs(locations[index].time_scaled - locations[center_index].time_scaled) <= eps_time) {
|
||||||
|
Match m = {index, distance};
|
||||||
|
arrput(*out_matches, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
kd_res_next(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
kd_res_free(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
int T_DBSCAN(struct kdtree *tree, Location *locations, double eps, double eps_time, double min_pts, Cluster **clusters) {
|
||||||
|
bool *visited = (bool *)calloc(arrlen(locations), sizeof(bool));
|
||||||
|
|
||||||
|
Match *matches = NULL;
|
||||||
|
Match *sub_matches = NULL;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < arrlen(locations); ++i) {
|
||||||
|
if (visited[i]) continue;
|
||||||
|
|
||||||
|
arrsetlen(matches, 0);
|
||||||
|
T_DBSCAN_RadiusSearchFiltered_ForStop(tree, locations, i, eps_time, &matches);
|
||||||
|
if (arrlen(matches) < min_pts) continue;
|
||||||
|
visited[i] = true;
|
||||||
|
|
||||||
|
Cluster cluster = {};
|
||||||
|
//cluster.indices = NULL;
|
||||||
|
arrput(cluster.indices, i);
|
||||||
|
locations[i].stoped = true;
|
||||||
|
|
||||||
|
while (arrlen(matches) > 0) {
|
||||||
|
Match m = arrpop(matches);
|
||||||
|
int nb_index = m.index;
|
||||||
|
|
||||||
|
if (visited[nb_index]) continue;
|
||||||
|
visited[nb_index] = true;
|
||||||
|
arrsetlen(sub_matches, 0);
|
||||||
|
T_DBSCAN_RadiusSearchFiltered_ForStop(tree, locations, nb_index, eps_time, &sub_matches);
|
||||||
|
|
||||||
|
if (arrlen(sub_matches) >= min_pts) {
|
||||||
|
for (int k = 0; k < arrlen(sub_matches); ++k) {
|
||||||
|
arrput(matches, sub_matches[k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arrput(cluster.indices, nb_index);
|
||||||
|
locations[nb_index].stoped = true;
|
||||||
|
}
|
||||||
|
arrput(*clusters, cluster);
|
||||||
|
//fprintf(stderr, "%d\n", arrlen(cluster.indices));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clusters) {
|
||||||
|
qsort(*clusters, arrlen(*clusters), sizeof(*clusters), compare_cluster_size);
|
||||||
|
}
|
||||||
|
return arrlen(*clusters);
|
||||||
|
}
|
||||||
15
src/time_utils.h
Normal file
15
src/time_utils.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
void Time_ConvertSecondsToHMS(long seconds, char *buffer) {
|
||||||
|
long hours = seconds / 3600;
|
||||||
|
long minutes = (seconds % 3600) / 60;
|
||||||
|
long secs = seconds % 60;
|
||||||
|
|
||||||
|
snprintf(buffer, 9, "%02ld:%02ld:%02ld", hours, minutes, secs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Time_UnixToHMS(long long unix_time, char *out) {
|
||||||
|
time_t t = (time_t)unix_time;
|
||||||
|
struct tm tm_info;
|
||||||
|
|
||||||
|
localtime_s(&tm_info, &t); // thread-safe
|
||||||
|
strftime(out, 20, "%d/%m/%Y %H:%M:%S", &tm_info);
|
||||||
|
}
|
||||||
36
src/timer.h
Normal file
36
src/timer.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
#ifdef _WIN32
|
||||||
|
LARGE_INTEGER start, freq;
|
||||||
|
#else
|
||||||
|
struct timespec start;
|
||||||
|
#endif
|
||||||
|
} simple_timer;
|
||||||
|
|
||||||
|
static inline void timer_start(simple_timer *t) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
QueryPerformanceFrequency(&t->freq);
|
||||||
|
QueryPerformanceCounter(&t->start);
|
||||||
|
#else
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &t->start);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline double timer_elapsed(simple_timer *t) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
LARGE_INTEGER end;
|
||||||
|
QueryPerformanceCounter(&end);
|
||||||
|
return (double)(end.QuadPart - t->start.QuadPart) / t->freq.QuadPart;
|
||||||
|
#else
|
||||||
|
struct timespec end;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
|
return (end.tv_sec - t->start.tv_sec) + (end.tv_nsec - t->start.tv_nsec) * 1e-9;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
1895
stb/stb_ds.h
Normal file
1895
stb/stb_ds.h
Normal file
File diff suppressed because it is too large
Load Diff
38
third_party/flatbuffers/.bazelci/presubmit.yml
vendored
Normal file
38
third_party/flatbuffers/.bazelci/presubmit.yml
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
buildifier: latest
|
||||||
|
bazel: 6.4.0
|
||||||
|
platforms:
|
||||||
|
ubuntu1804:
|
||||||
|
environment:
|
||||||
|
CC: clang
|
||||||
|
SWIFT_VERSION: "5.5.3"
|
||||||
|
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
||||||
|
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
||||||
|
shell_commands:
|
||||||
|
- "echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME"
|
||||||
|
- "mkdir $SWIFT_HOME"
|
||||||
|
- "curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu1804/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu18.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME"
|
||||||
|
build_targets:
|
||||||
|
- "//..."
|
||||||
|
test_targets:
|
||||||
|
- "//..."
|
||||||
|
ubuntu2004:
|
||||||
|
environment:
|
||||||
|
CC: clang
|
||||||
|
SWIFT_VERSION: "5.5.3"
|
||||||
|
SWIFT_HOME: "$HOME/swift-$SWIFT_VERSION"
|
||||||
|
PATH: "$PATH:$SWIFT_HOME/usr/bin"
|
||||||
|
shell_commands:
|
||||||
|
- "echo --- Downloading and extracting Swift $SWIFT_VERSION to $SWIFT_HOME"
|
||||||
|
- "mkdir $SWIFT_HOME"
|
||||||
|
- "curl https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2004/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu20.04.tar.gz | tar xvz --strip-components=1 -C $SWIFT_HOME"
|
||||||
|
build_targets:
|
||||||
|
- "//..."
|
||||||
|
test_targets:
|
||||||
|
- "//..."
|
||||||
|
macos:
|
||||||
|
xcode_version: "14.2"
|
||||||
|
build_targets:
|
||||||
|
- "//..."
|
||||||
|
test_targets:
|
||||||
|
- "//..."
|
||||||
1
third_party/flatbuffers/.bazelignore
vendored
Normal file
1
third_party/flatbuffers/.bazelignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
4
third_party/flatbuffers/.bazelrc
vendored
Normal file
4
third_party/flatbuffers/.bazelrc
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# We cannot use "common" here because the "version" command doesn't support
|
||||||
|
# --deleted_packages. We need to specify it for both build and query instead.
|
||||||
|
build --deleted_packages=tests/ts/bazel_repository_test_dir
|
||||||
|
query --deleted_packages=tests/ts/bazel_repository_test_dir
|
||||||
13
third_party/flatbuffers/.clang-format
vendored
Normal file
13
third_party/flatbuffers/.clang-format
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
BasedOnStyle: Google
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
PointerAlignment: Right
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
AllowShortBlocksOnASingleLine: true
|
||||||
|
...
|
||||||
|
|
||||||
347
third_party/flatbuffers/.clang-tidy
vendored
Normal file
347
third_party/flatbuffers/.clang-tidy
vendored
Normal file
@ -0,0 +1,347 @@
|
|||||||
|
---
|
||||||
|
FormatStyle: "file"
|
||||||
|
WarningsAsErrors: "*"
|
||||||
|
HeaderFilterRegex: ".*"
|
||||||
|
Checks: "google-build-explicit-make-pair,
|
||||||
|
google-build-namespaces,
|
||||||
|
google-build-using-namespace,
|
||||||
|
google-default-arguments,
|
||||||
|
google-explicit-constructor,
|
||||||
|
google-global-names-in-headers,
|
||||||
|
google-objc-avoid-nsobject-new,
|
||||||
|
google-objc-avoid-throwing-exception,
|
||||||
|
google-objc-function-naming,
|
||||||
|
google-objc-global-variable-declaration,
|
||||||
|
google-readability-avoid-underscore-in-googletest-name,
|
||||||
|
google-readability-braces-around-statements,
|
||||||
|
google-readability-casting,
|
||||||
|
google-readability-function-size,
|
||||||
|
google-readability-namespace-comments,
|
||||||
|
google-runtime-int,
|
||||||
|
google-runtime-operator,
|
||||||
|
google-upgrade-googletest-case,
|
||||||
|
clang-analyzer-apiModeling.StdCLibraryFunctions,
|
||||||
|
clang-analyzer-apiModeling.TrustNonnull,
|
||||||
|
clang-analyzer-apiModeling.google.GTest,
|
||||||
|
clang-analyzer-apiModeling.llvm.CastValue,
|
||||||
|
clang-analyzer-apiModeling.llvm.ReturnValue,
|
||||||
|
clang-analyzer-core.CallAndMessage,
|
||||||
|
clang-analyzer-core.CallAndMessageModeling,
|
||||||
|
clang-analyzer-core.DivideZero,
|
||||||
|
clang-analyzer-core.DynamicTypePropagation,
|
||||||
|
clang-analyzer-core.NonNullParamChecker,
|
||||||
|
clang-analyzer-core.NonnilStringConstants,
|
||||||
|
clang-analyzer-core.NullDereference,
|
||||||
|
clang-analyzer-core.StackAddrEscapeBase,
|
||||||
|
clang-analyzer-core.StackAddressEscape,
|
||||||
|
clang-analyzer-core.UndefinedBinaryOperatorResult,
|
||||||
|
clang-analyzer-core.VLASize,
|
||||||
|
clang-analyzer-core.builtin.BuiltinFunctions,
|
||||||
|
clang-analyzer-core.builtin.NoReturnFunctions,
|
||||||
|
clang-analyzer-core.uninitialized.ArraySubscript,
|
||||||
|
clang-analyzer-core.uninitialized.Assign,
|
||||||
|
clang-analyzer-core.uninitialized.Branch,
|
||||||
|
clang-analyzer-core.uninitialized.CapturedBlockVariable,
|
||||||
|
clang-analyzer-core.uninitialized.UndefReturn,
|
||||||
|
clang-analyzer-cplusplus.InnerPointer,
|
||||||
|
clang-analyzer-cplusplus.Move,
|
||||||
|
clang-analyzer-cplusplus.NewDelete,
|
||||||
|
clang-analyzer-cplusplus.NewDeleteLeaks,
|
||||||
|
clang-analyzer-cplusplus.PlacementNew,
|
||||||
|
clang-analyzer-cplusplus.PureVirtualCall,
|
||||||
|
clang-analyzer-cplusplus.SelfAssignment,
|
||||||
|
clang-analyzer-cplusplus.SmartPtrModeling,
|
||||||
|
clang-analyzer-cplusplus.StringChecker,
|
||||||
|
clang-analyzer-cplusplus.VirtualCallModeling,
|
||||||
|
clang-analyzer-deadcode.DeadStores,
|
||||||
|
clang-analyzer-fuchsia.HandleChecker,
|
||||||
|
clang-analyzer-nullability.NullPassedToNonnull,
|
||||||
|
clang-analyzer-nullability.NullReturnedFromNonnull,
|
||||||
|
clang-analyzer-nullability.NullabilityBase,
|
||||||
|
clang-analyzer-nullability.NullableDereferenced,
|
||||||
|
clang-analyzer-nullability.NullablePassedToNonnull,
|
||||||
|
clang-analyzer-nullability.NullableReturnedFromNonnull,
|
||||||
|
clang-analyzer-optin.cplusplus.UninitializedObject,
|
||||||
|
clang-analyzer-optin.cplusplus.VirtualCall,
|
||||||
|
clang-analyzer-optin.mpi.MPI-Checker,
|
||||||
|
clang-analyzer-optin.osx.OSObjectCStyleCast,
|
||||||
|
clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker,
|
||||||
|
clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker,
|
||||||
|
clang-analyzer-optin.performance.GCDAntipattern,
|
||||||
|
clang-analyzer-optin.performance.Padding,
|
||||||
|
clang-analyzer-optin.portability.UnixAPI,
|
||||||
|
clang-analyzer-osx.API,
|
||||||
|
clang-analyzer-osx.MIG,
|
||||||
|
clang-analyzer-osx.NSOrCFErrorDerefChecker,
|
||||||
|
clang-analyzer-osx.NumberObjectConversion,
|
||||||
|
clang-analyzer-osx.OSObjectRetainCount,
|
||||||
|
clang-analyzer-osx.ObjCProperty,
|
||||||
|
clang-analyzer-osx.SecKeychainAPI,
|
||||||
|
clang-analyzer-osx.cocoa.AtSync,
|
||||||
|
clang-analyzer-osx.cocoa.AutoreleaseWrite,
|
||||||
|
clang-analyzer-osx.cocoa.ClassRelease,
|
||||||
|
clang-analyzer-osx.cocoa.Dealloc,
|
||||||
|
clang-analyzer-osx.cocoa.IncompatibleMethodTypes,
|
||||||
|
clang-analyzer-osx.cocoa.Loops,
|
||||||
|
clang-analyzer-osx.cocoa.MissingSuperCall,
|
||||||
|
clang-analyzer-osx.cocoa.NSAutoreleasePool,
|
||||||
|
clang-analyzer-osx.cocoa.NSError,
|
||||||
|
clang-analyzer-osx.cocoa.NilArg,
|
||||||
|
clang-analyzer-osx.cocoa.NonNilReturnValue,
|
||||||
|
clang-analyzer-osx.cocoa.ObjCGenerics,
|
||||||
|
clang-analyzer-osx.cocoa.RetainCount,
|
||||||
|
clang-analyzer-osx.cocoa.RetainCountBase,
|
||||||
|
clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak,
|
||||||
|
clang-analyzer-osx.cocoa.SelfInit,
|
||||||
|
clang-analyzer-osx.cocoa.SuperDealloc,
|
||||||
|
clang-analyzer-osx.cocoa.UnusedIvars,
|
||||||
|
clang-analyzer-osx.cocoa.VariadicMethodTypes,
|
||||||
|
clang-analyzer-osx.coreFoundation.CFError,
|
||||||
|
clang-analyzer-osx.coreFoundation.CFNumber,
|
||||||
|
clang-analyzer-osx.coreFoundation.CFRetainRelease,
|
||||||
|
clang-analyzer-osx.coreFoundation.containers.OutOfBounds,
|
||||||
|
clang-analyzer-osx.coreFoundation.containers.PointerSizedValues,
|
||||||
|
clang-analyzer-security.FloatLoopCounter,
|
||||||
|
clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
|
clang-analyzer-security.insecureAPI.SecuritySyntaxChecker,
|
||||||
|
clang-analyzer-security.insecureAPI.UncheckedReturn,
|
||||||
|
clang-analyzer-security.insecureAPI.bcmp,
|
||||||
|
clang-analyzer-security.insecureAPI.bcopy,
|
||||||
|
clang-analyzer-security.insecureAPI.bzero,
|
||||||
|
clang-analyzer-security.insecureAPI.decodeValueOfObjCType,
|
||||||
|
clang-analyzer-security.insecureAPI.getpw,
|
||||||
|
clang-analyzer-security.insecureAPI.gets,
|
||||||
|
clang-analyzer-security.insecureAPI.mkstemp,
|
||||||
|
clang-analyzer-security.insecureAPI.mktemp,
|
||||||
|
clang-analyzer-security.insecureAPI.rand,
|
||||||
|
clang-analyzer-security.insecureAPI.strcpy,
|
||||||
|
clang-analyzer-security.insecureAPI.vfork,
|
||||||
|
clang-analyzer-unix.API,
|
||||||
|
clang-analyzer-unix.DynamicMemoryModeling,
|
||||||
|
clang-analyzer-unix.Malloc,
|
||||||
|
clang-analyzer-unix.MallocSizeof,
|
||||||
|
clang-analyzer-unix.MismatchedDeallocator,
|
||||||
|
clang-analyzer-unix.Vfork,
|
||||||
|
clang-analyzer-unix.cstring.BadSizeArg,
|
||||||
|
clang-analyzer-unix.cstring.CStringModeling,
|
||||||
|
clang-analyzer-unix.cstring.NullArg,
|
||||||
|
clang-analyzer-valist.CopyToSelf,
|
||||||
|
clang-analyzer-valist.Uninitialized,
|
||||||
|
clang-analyzer-valist.Unterminated,
|
||||||
|
clang-analyzer-valist.ValistBase,
|
||||||
|
clang-analyzer-webkit.NoUncountedMemberChecker,
|
||||||
|
clang-analyzer-webkit.RefCntblBaseVirtualDtor,
|
||||||
|
clang-analyzer-webkit.UncountedLambdaCapturesChecker,
|
||||||
|
|
||||||
|
################################################ Optional checks ################################################
|
||||||
|
|
||||||
|
#google-readability-todo,
|
||||||
|
#bugprone-argument-comment,
|
||||||
|
#bugprone-assert-side-effect,
|
||||||
|
#bugprone-bad-signal-to-kill-thread,
|
||||||
|
#bugprone-bool-pointer-implicit-conversion,
|
||||||
|
#bugprone-branch-clone,
|
||||||
|
#bugprone-copy-constructor-init,
|
||||||
|
#bugprone-dangling-handle,
|
||||||
|
#bugprone-dynamic-static-initializers,
|
||||||
|
#bugprone-easily-swappable-parameters,
|
||||||
|
#bugprone-exception-escape,
|
||||||
|
#bugprone-fold-init-type,
|
||||||
|
#bugprone-forward-declaration-namespace,
|
||||||
|
#bugprone-forwarding-reference-overload,
|
||||||
|
#bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
#bugprone-inaccurate-erase,
|
||||||
|
#bugprone-incorrect-roundings,
|
||||||
|
#bugprone-infinite-loop,
|
||||||
|
#bugprone-integer-division,
|
||||||
|
#bugprone-lambda-function-name,
|
||||||
|
#bugprone-macro-parentheses,
|
||||||
|
#bugprone-macro-repeated-side-effects,
|
||||||
|
#bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||||
|
#bugprone-misplaced-pointer-arithmetic-in-alloc,
|
||||||
|
#bugprone-misplaced-widening-cast,
|
||||||
|
#bugprone-move-forwarding-reference,
|
||||||
|
#bugprone-multiple-statement-macro,
|
||||||
|
#bugprone-narrowing-conversions,
|
||||||
|
#bugprone-no-escape,
|
||||||
|
#bugprone-not-null-terminated-result,
|
||||||
|
#bugprone-parent-virtual-call,
|
||||||
|
#bugprone-posix-return,
|
||||||
|
#bugprone-redundant-branch-condition,
|
||||||
|
#bugprone-reserved-identifier,
|
||||||
|
#bugprone-signal-handler,
|
||||||
|
#bugprone-signed-char-misuse,
|
||||||
|
#bugprone-sizeof-container,
|
||||||
|
#bugprone-sizeof-expression,
|
||||||
|
#bugprone-spuriously-wake-up-functions,
|
||||||
|
#bugprone-string-constructor,
|
||||||
|
#bugprone-string-integer-assignment,
|
||||||
|
#bugprone-string-literal-with-embedded-nul,
|
||||||
|
#bugprone-stringview-nullptr,
|
||||||
|
#bugprone-suspicious-enum-usage,
|
||||||
|
#bugprone-suspicious-include,
|
||||||
|
#bugprone-suspicious-memory-comparison,
|
||||||
|
#bugprone-suspicious-memset-usage,
|
||||||
|
#bugprone-suspicious-missing-comma,
|
||||||
|
#bugprone-suspicious-semicolon,
|
||||||
|
#bugprone-suspicious-string-compare,
|
||||||
|
#bugprone-swapped-arguments,
|
||||||
|
#bugprone-terminating-continue,
|
||||||
|
#bugprone-throw-keyword-missing,
|
||||||
|
#bugprone-too-small-loop-variable,
|
||||||
|
#bugprone-undefined-memory-manipulation,
|
||||||
|
#bugprone-undelegated-constructor,
|
||||||
|
#bugprone-unhandled-exception-at-new,
|
||||||
|
#bugprone-unhandled-self-assignment,
|
||||||
|
#bugprone-unused-raii,
|
||||||
|
#bugprone-unused-return-value,
|
||||||
|
#bugprone-use-after-move,
|
||||||
|
#bugprone-virtual-near-miss,
|
||||||
|
#cppcoreguidelines-avoid-c-arrays,
|
||||||
|
#cppcoreguidelines-avoid-goto,
|
||||||
|
#cppcoreguidelines-avoid-magic-numbers,
|
||||||
|
#cppcoreguidelines-avoid-non-const-global-variables,
|
||||||
|
#cppcoreguidelines-c-copy-assignment-signature,
|
||||||
|
#cppcoreguidelines-explicit-virtual-functions,
|
||||||
|
#cppcoreguidelines-init-variables,
|
||||||
|
#cppcoreguidelines-interfaces-global-init,
|
||||||
|
#cppcoreguidelines-macro-usage,
|
||||||
|
#cppcoreguidelines-narrowing-conversions,
|
||||||
|
#cppcoreguidelines-no-malloc,
|
||||||
|
#cppcoreguidelines-non-private-member-variables-in-classes,
|
||||||
|
#cppcoreguidelines-owning-memory,
|
||||||
|
#cppcoreguidelines-prefer-member-initializer,
|
||||||
|
#cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||||
|
#cppcoreguidelines-pro-bounds-constant-array-index,
|
||||||
|
#cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||||
|
#cppcoreguidelines-pro-type-const-cast,
|
||||||
|
#cppcoreguidelines-pro-type-cstyle-cast,
|
||||||
|
#cppcoreguidelines-pro-type-member-init,
|
||||||
|
#cppcoreguidelines-pro-type-reinterpret-cast,
|
||||||
|
#cppcoreguidelines-pro-type-static-cast-downcast,
|
||||||
|
#cppcoreguidelines-pro-type-union-access,
|
||||||
|
#cppcoreguidelines-pro-type-vararg,
|
||||||
|
#cppcoreguidelines-slicing,
|
||||||
|
#cppcoreguidelines-special-member-functions,
|
||||||
|
#cppcoreguidelines-virtual-class-destructor,
|
||||||
|
#hicpp-avoid-c-arrays,
|
||||||
|
#hicpp-avoid-goto,
|
||||||
|
#hicpp-braces-around-statements,
|
||||||
|
#hicpp-deprecated-headers,
|
||||||
|
#hicpp-exception-baseclass,
|
||||||
|
#hicpp-explicit-conversions,
|
||||||
|
#hicpp-function-size,
|
||||||
|
#hicpp-invalid-access-moved,
|
||||||
|
#hicpp-member-init,
|
||||||
|
#hicpp-move-const-arg,
|
||||||
|
#hicpp-multiway-paths-covered,
|
||||||
|
#hicpp-named-parameter,
|
||||||
|
#hicpp-new-delete-operators,
|
||||||
|
#hicpp-no-array-decay,
|
||||||
|
#hicpp-no-assembler,
|
||||||
|
#hicpp-no-malloc,
|
||||||
|
#hicpp-noexcept-move,
|
||||||
|
#hicpp-signed-bitwise,
|
||||||
|
#hicpp-special-member-functions,
|
||||||
|
#hicpp-static-assert,
|
||||||
|
#hicpp-undelegated-constructor,
|
||||||
|
#hicpp-uppercase-literal-suffix,
|
||||||
|
#hicpp-use-auto,
|
||||||
|
#hicpp-use-emplace,
|
||||||
|
#hicpp-use-equals-default,
|
||||||
|
#hicpp-use-equals-delete,
|
||||||
|
#hicpp-use-noexcept,
|
||||||
|
#hicpp-use-nullptr,
|
||||||
|
#hicpp-use-override,
|
||||||
|
#hicpp-vararg,
|
||||||
|
#modernize-avoid-bind,
|
||||||
|
#modernize-avoid-c-arrays,
|
||||||
|
#modernize-concat-nested-namespaces,
|
||||||
|
#modernize-deprecated-headers,
|
||||||
|
#modernize-deprecated-ios-base-aliases,
|
||||||
|
#modernize-loop-convert,
|
||||||
|
#modernize-make-shared,
|
||||||
|
#modernize-make-unique,
|
||||||
|
#modernize-pass-by-value,
|
||||||
|
#modernize-raw-string-literal,
|
||||||
|
#modernize-redundant-void-arg,
|
||||||
|
#modernize-replace-auto-ptr,
|
||||||
|
#modernize-replace-disallow-copy-and-assign-macro,
|
||||||
|
#modernize-replace-random-shuffle,
|
||||||
|
#modernize-return-braced-init-list,
|
||||||
|
#modernize-shrink-to-fit,
|
||||||
|
#modernize-unary-static-assert,
|
||||||
|
#modernize-use-auto,
|
||||||
|
#modernize-use-bool-literals,
|
||||||
|
#modernize-use-default-member-init,
|
||||||
|
#modernize-use-emplace,
|
||||||
|
#modernize-use-equals-default,
|
||||||
|
#modernize-use-equals-delete,
|
||||||
|
#modernize-use-nodiscard,
|
||||||
|
#modernize-use-noexcept,
|
||||||
|
#modernize-use-nullptr,
|
||||||
|
#modernize-use-override,
|
||||||
|
#modernize-use-trailing-return-type,
|
||||||
|
#modernize-use-transparent-functors,
|
||||||
|
#modernize-use-uncaught-exceptions,
|
||||||
|
#modernize-use-using,
|
||||||
|
#performance-faster-string-find,
|
||||||
|
#performance-for-range-copy,
|
||||||
|
#performance-implicit-conversion-in-loop,
|
||||||
|
#performance-inefficient-algorithm,
|
||||||
|
#performance-inefficient-string-concatenation,
|
||||||
|
#performance-inefficient-vector-operation,
|
||||||
|
#performance-move-const-arg,
|
||||||
|
#performance-move-constructor-init,
|
||||||
|
#performance-no-automatic-move,
|
||||||
|
#performance-no-int-to-ptr,
|
||||||
|
#performance-noexcept-move-constructor,
|
||||||
|
#performance-trivially-destructible,
|
||||||
|
#performance-type-promotion-in-math-fn,
|
||||||
|
#performance-unnecessary-copy-initialization,
|
||||||
|
#performance-unnecessary-value-param,
|
||||||
|
#portability-restrict-system-includes,
|
||||||
|
#portability-simd-intrinsics,
|
||||||
|
#readability-avoid-const-params-in-decls,
|
||||||
|
#readability-braces-around-statements,
|
||||||
|
#readability-const-return-type,
|
||||||
|
#readability-container-contains,
|
||||||
|
#readability-container-data-pointer,
|
||||||
|
#readability-container-size-empty,
|
||||||
|
#readability-convert-member-functions-to-static,
|
||||||
|
#readability-delete-null-pointer,
|
||||||
|
#readability-duplicate-include,
|
||||||
|
#readability-else-after-return,
|
||||||
|
#readability-function-cognitive-complexity,
|
||||||
|
#readability-function-size,
|
||||||
|
#readability-identifier-length,
|
||||||
|
#readability-identifier-naming,
|
||||||
|
#readability-implicit-bool-conversion,
|
||||||
|
#readability-inconsistent-declaration-parameter-name,
|
||||||
|
#readability-isolate-declaration,
|
||||||
|
#readability-magic-numbers,
|
||||||
|
#readability-make-member-function-const,
|
||||||
|
#readability-misleading-indentation,
|
||||||
|
#readability-misplaced-array-index,
|
||||||
|
#readability-named-parameter,
|
||||||
|
#readability-non-const-parameter,
|
||||||
|
#readability-qualified-auto,
|
||||||
|
#readability-redundant-access-specifiers,
|
||||||
|
#readability-redundant-control-flow,
|
||||||
|
#readability-redundant-declaration,
|
||||||
|
#readability-redundant-function-ptr-dereference,
|
||||||
|
#readability-redundant-member-init,
|
||||||
|
#readability-redundant-preprocessor,
|
||||||
|
#readability-redundant-smartptr-get,
|
||||||
|
#readability-redundant-string-cstr,
|
||||||
|
#readability-redundant-string-init,
|
||||||
|
#readability-simplify-boolean-expr,
|
||||||
|
#readability-simplify-subscript-expr,
|
||||||
|
#readability-static-accessed-through-instance,
|
||||||
|
#readability-static-definition-in-anonymous-namespace,
|
||||||
|
#readability-string-compare,
|
||||||
|
#readability-suspicious-call-argument,
|
||||||
|
#readability-uniqueptr-delete-release,
|
||||||
|
#readability-uppercase-literal-suffix,
|
||||||
|
#readability-use-anyofallof
|
||||||
|
"
|
||||||
8
third_party/flatbuffers/.editorconfig
vendored
Normal file
8
third_party/flatbuffers/.editorconfig
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
root = true
|
||||||
|
# Don't set line endings to avoid conflict with core.autocrlf flag.
|
||||||
|
# Line endings on checkout/checkin are controlled by .gitattributes file.
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
13
third_party/flatbuffers/.eslintrc.js
vendored
Normal file
13
third_party/flatbuffers/.eslintrc.js
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/* eslint-env node */
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: [
|
||||||
|
'@typescript-eslint',
|
||||||
|
],
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
]
|
||||||
|
};
|
||||||
2
third_party/flatbuffers/.gitattributes
vendored
Normal file
2
third_party/flatbuffers/.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
|
* text=auto
|
||||||
155
third_party/flatbuffers/.gitignore
vendored
Normal file
155
third_party/flatbuffers/.gitignore
vendored
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
*_wire.txt
|
||||||
|
*_wire.bin
|
||||||
|
.DS_Store
|
||||||
|
**/.build
|
||||||
|
build
|
||||||
|
**/Packages
|
||||||
|
/*.xcodeproj
|
||||||
|
**/xcuserdata/
|
||||||
|
**/xcshareddata/
|
||||||
|
**/.swiftpm/
|
||||||
|
*.o
|
||||||
|
*.o.d
|
||||||
|
*.class
|
||||||
|
*.a
|
||||||
|
*.swp
|
||||||
|
*~
|
||||||
|
*.vcxproj
|
||||||
|
*.vcxproj.filters
|
||||||
|
*.vcxproj.user
|
||||||
|
*.sln
|
||||||
|
*.suo
|
||||||
|
*.opendb
|
||||||
|
*.keystore
|
||||||
|
**/.vs/**
|
||||||
|
**/bin/**
|
||||||
|
!tests/rust_usage_test/bin/**
|
||||||
|
**/gen/**
|
||||||
|
**/libs/**
|
||||||
|
**/obj/**
|
||||||
|
**/*.dir/**
|
||||||
|
**/CMakeFiles/**
|
||||||
|
**/cmake_install.cmake
|
||||||
|
**/install_manifest.txt
|
||||||
|
**/CMakeCache.txt
|
||||||
|
**/CMakeTestfile.cmake
|
||||||
|
**/CPackConfig.cmake
|
||||||
|
**/CPackSourceConfig.cmake
|
||||||
|
**/compile_commands.json
|
||||||
|
**/Debug/**
|
||||||
|
**/Release/**
|
||||||
|
**/RelWithDebInfo/**
|
||||||
|
**/x64/ #build artifacts from VS
|
||||||
|
build.xml
|
||||||
|
local.properties
|
||||||
|
project.properties
|
||||||
|
proguard-project.txt
|
||||||
|
linklint_results
|
||||||
|
Makefile
|
||||||
|
flatbenchmark
|
||||||
|
flatbenchmark.exe
|
||||||
|
flatc
|
||||||
|
flatc.exe
|
||||||
|
flathash
|
||||||
|
flathash.exe
|
||||||
|
flattests
|
||||||
|
flattests.exe
|
||||||
|
flattests_cpp17
|
||||||
|
flattests_cpp17.exe
|
||||||
|
flatsamplebinary
|
||||||
|
flatsamplebinary.exe
|
||||||
|
flatsampletext
|
||||||
|
flatsampletext.exe
|
||||||
|
flatsamplebfbs
|
||||||
|
flatsamplebfbs.exe
|
||||||
|
grpctest
|
||||||
|
grpctest.exe
|
||||||
|
snapshot.sh
|
||||||
|
tags
|
||||||
|
tests/dart_gen
|
||||||
|
tests/go_gen
|
||||||
|
tests/monsterdata_java_wire.mon
|
||||||
|
tests/monsterdata_java_wire_sp.mon
|
||||||
|
tests/monsterdata_go_wire.mon
|
||||||
|
tests/monsterdata_javascript_wire.mon
|
||||||
|
tests/monsterdata_lobster_wire.mon
|
||||||
|
tests/monsterdata_rust_wire.mon
|
||||||
|
tests/php/
|
||||||
|
CMakeLists.txt.user
|
||||||
|
CMakeScripts/**
|
||||||
|
CTestTestfile.cmake
|
||||||
|
flatbuffers-config-version.cmake
|
||||||
|
FlatBuffers.cbp
|
||||||
|
build/Xcode/FlatBuffers.xcodeproj/project.xcworkspace/**
|
||||||
|
build/Xcode/FlatBuffers.xcodeproj/xcuserdata/**
|
||||||
|
FlatBuffers.xcodeproj/
|
||||||
|
java/.idea
|
||||||
|
java/*.iml
|
||||||
|
.idea
|
||||||
|
*.iml
|
||||||
|
target
|
||||||
|
java/target
|
||||||
|
**/*.pyc
|
||||||
|
build/VS2010/FlatBuffers.sdf
|
||||||
|
build/VS2010/FlatBuffers.opensdf
|
||||||
|
build/VS2010/ipch/**/*.ipch
|
||||||
|
*.so
|
||||||
|
Testing/Temporary
|
||||||
|
.cproject
|
||||||
|
.settings/
|
||||||
|
.project
|
||||||
|
net/**/obj
|
||||||
|
node_modules/
|
||||||
|
android/.externalNativeBuild/
|
||||||
|
android/.gradle/
|
||||||
|
android/build/
|
||||||
|
samples/android/.externalNativeBuild/
|
||||||
|
samples/android/.gradle/
|
||||||
|
samples/android/build/
|
||||||
|
js/**/*.js
|
||||||
|
js/**/*.d.ts
|
||||||
|
mjs/**/*.js
|
||||||
|
mjs/**/*.d.ts
|
||||||
|
/bazel-bin
|
||||||
|
/bazel-flatbuffers
|
||||||
|
/bazel-genfiles
|
||||||
|
/bazel-out
|
||||||
|
/bazel-testlogs
|
||||||
|
.ninja_deps
|
||||||
|
.ninja_log
|
||||||
|
build.ninja
|
||||||
|
rules.ninja
|
||||||
|
.vscode
|
||||||
|
dart/.pub/
|
||||||
|
dart/.packages
|
||||||
|
dart/pubspec.lock
|
||||||
|
dart/.dart_tool/
|
||||||
|
dart/build/
|
||||||
|
dart/doc/api/
|
||||||
|
Cargo.lock
|
||||||
|
.corpus**
|
||||||
|
.seed**
|
||||||
|
.crash**
|
||||||
|
grpc/google/
|
||||||
|
**/Package.resolved
|
||||||
|
.clangd/**
|
||||||
|
package-lock.json
|
||||||
|
/*.ilk
|
||||||
|
/*.pdb
|
||||||
|
.clwb
|
||||||
|
yarn-error.log
|
||||||
|
.cache/
|
||||||
|
/flatbuffers.lib
|
||||||
|
.cmake/
|
||||||
|
**/dist
|
||||||
|
**/vendor
|
||||||
|
**/go.sum
|
||||||
|
flatbuffers.pc
|
||||||
|
**/FlatBuffers.Test.Swift.xcodeproj
|
||||||
|
**/html/**
|
||||||
|
**/latex/**
|
||||||
|
# https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_BASE_DIR
|
||||||
|
cmake-build-debug/
|
||||||
|
_deps/
|
||||||
|
**/.gradle/**
|
||||||
|
kotlin/**/generated
|
||||||
1
third_party/flatbuffers/.npmrc
vendored
Normal file
1
third_party/flatbuffers/.npmrc
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
hoist=false
|
||||||
139
third_party/flatbuffers/BUILD.bazel
vendored
Normal file
139
third_party/flatbuffers/BUILD.bazel
vendored
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
load("@aspect_rules_js//npm:defs.bzl", "npm_link_package")
|
||||||
|
load("@npm//:defs.bzl", "npm_link_all_packages")
|
||||||
|
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
package(
|
||||||
|
default_visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
npm_link_all_packages(name = "node_modules")
|
||||||
|
|
||||||
|
npm_link_package(
|
||||||
|
name = "node_modules/flatbuffers",
|
||||||
|
src = "//ts:flatbuffers",
|
||||||
|
)
|
||||||
|
|
||||||
|
exports_files([
|
||||||
|
"LICENSE",
|
||||||
|
"tsconfig.json",
|
||||||
|
])
|
||||||
|
|
||||||
|
config_setting(
|
||||||
|
name = "platform_freebsd",
|
||||||
|
constraint_values = [
|
||||||
|
"@platforms//os:freebsd",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
config_setting(
|
||||||
|
name = "platform_openbsd",
|
||||||
|
constraint_values = [
|
||||||
|
"@platforms//os:openbsd",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "distribution",
|
||||||
|
srcs = [
|
||||||
|
"BUILD.bazel",
|
||||||
|
"WORKSPACE",
|
||||||
|
"build_defs.bzl",
|
||||||
|
"typescript.bzl",
|
||||||
|
"//grpc/src/compiler:distribution",
|
||||||
|
"//reflection:distribution",
|
||||||
|
"//src:distribution",
|
||||||
|
"//ts:distribution",
|
||||||
|
] + glob([
|
||||||
|
"include/flatbuffers/*.h",
|
||||||
|
]),
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Public flatc library to compile flatbuffer files at runtime.
|
||||||
|
cc_library(
|
||||||
|
name = "flatbuffers",
|
||||||
|
hdrs = ["//:public_headers"],
|
||||||
|
linkstatic = 1,
|
||||||
|
strip_include_prefix = "/include",
|
||||||
|
deps = ["//src:flatbuffers"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Public C++ headers for the Flatbuffers library.
|
||||||
|
filegroup(
|
||||||
|
name = "public_headers",
|
||||||
|
srcs = [
|
||||||
|
"include/flatbuffers/allocator.h",
|
||||||
|
"include/flatbuffers/array.h",
|
||||||
|
"include/flatbuffers/base.h",
|
||||||
|
"include/flatbuffers/buffer.h",
|
||||||
|
"include/flatbuffers/buffer_ref.h",
|
||||||
|
"include/flatbuffers/code_generator.h",
|
||||||
|
"include/flatbuffers/code_generators.h",
|
||||||
|
"include/flatbuffers/default_allocator.h",
|
||||||
|
"include/flatbuffers/detached_buffer.h",
|
||||||
|
"include/flatbuffers/file_manager.h",
|
||||||
|
"include/flatbuffers/flatbuffer_builder.h",
|
||||||
|
"include/flatbuffers/flatbuffers.h",
|
||||||
|
"include/flatbuffers/flex_flat_util.h",
|
||||||
|
"include/flatbuffers/flexbuffers.h",
|
||||||
|
"include/flatbuffers/grpc.h",
|
||||||
|
"include/flatbuffers/hash.h",
|
||||||
|
"include/flatbuffers/idl.h",
|
||||||
|
"include/flatbuffers/minireflect.h",
|
||||||
|
"include/flatbuffers/reflection.h",
|
||||||
|
"include/flatbuffers/reflection_generated.h",
|
||||||
|
"include/flatbuffers/registry.h",
|
||||||
|
"include/flatbuffers/stl_emulation.h",
|
||||||
|
"include/flatbuffers/string.h",
|
||||||
|
"include/flatbuffers/struct.h",
|
||||||
|
"include/flatbuffers/table.h",
|
||||||
|
"include/flatbuffers/util.h",
|
||||||
|
"include/flatbuffers/vector.h",
|
||||||
|
"include/flatbuffers/vector_downward.h",
|
||||||
|
"include/flatbuffers/verifier.h",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Public flatc compiler library.
|
||||||
|
cc_library(
|
||||||
|
name = "flatc_library",
|
||||||
|
linkstatic = 1,
|
||||||
|
deps = [
|
||||||
|
"//src:flatc_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Public flatc compiler.
|
||||||
|
cc_binary(
|
||||||
|
name = "flatc",
|
||||||
|
data = ["//reflection:reflection_fbs_schema"],
|
||||||
|
deps = [
|
||||||
|
"//src:flatc",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "flatc_headers",
|
||||||
|
srcs = [
|
||||||
|
"include/flatbuffers/flatc.h",
|
||||||
|
],
|
||||||
|
visibility = ["//:__subpackages__"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Library used by flatbuffer_cc_library rules.
|
||||||
|
cc_library(
|
||||||
|
name = "runtime_cc",
|
||||||
|
hdrs = [
|
||||||
|
"include/flatbuffers/base.h",
|
||||||
|
"include/flatbuffers/flatbuffers.h",
|
||||||
|
"include/flatbuffers/flexbuffers.h",
|
||||||
|
"include/flatbuffers/stl_emulation.h",
|
||||||
|
"include/flatbuffers/util.h",
|
||||||
|
"include/flatbuffers/vector.h",
|
||||||
|
"include/flatbuffers/verifier.h",
|
||||||
|
],
|
||||||
|
linkstatic = 1,
|
||||||
|
strip_include_prefix = "/include",
|
||||||
|
)
|
||||||
168
third_party/flatbuffers/CHANGELOG.md
vendored
Normal file
168
third_party/flatbuffers/CHANGELOG.md
vendored
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
# Flatbuffers Change Log
|
||||||
|
|
||||||
|
All major or breaking changes will be documented in this file, as well as any
|
||||||
|
new features that should be highlighted. Minor fixes or improvements are not
|
||||||
|
necessarily listed.
|
||||||
|
|
||||||
|
## [24.3.25] (March 25 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.25)
|
||||||
|
|
||||||
|
* Fixed license metadata parsing (#8253)
|
||||||
|
* [C++] Allow string_view in `LookUpByKey` in addition to null-terminated c-style strings (#8203)
|
||||||
|
|
||||||
|
## [24.3.7] (March 7 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.7)
|
||||||
|
|
||||||
|
* Just to fix some of the CI build issues from the 24.3.6 release.
|
||||||
|
|
||||||
|
## [24.3.6] (March 6 2024)(https://github.com/google/flatbuffers/releases/tag/v24.3.6)
|
||||||
|
|
||||||
|
* Fix typescript object API to allow 0 values for null-default scalars (#7864)
|
||||||
|
|
||||||
|
## [23.5.26 (May 26 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.26)
|
||||||
|
|
||||||
|
* Mostly bug fixing for 64-bit support
|
||||||
|
* Adds support for specifying underling type of unions in C++ and TS/JS (#7954)
|
||||||
|
|
||||||
|
## [23.5.9 (May 9 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.9)
|
||||||
|
|
||||||
|
* 64-bit support for C++ (#7935)
|
||||||
|
|
||||||
|
## [23.5.8 (May 8 2023)](https://github.com/google/flatbuffers/releases/tag/v23.5.8)
|
||||||
|
|
||||||
|
* add key_field to compiled tests
|
||||||
|
* Add golden language directory
|
||||||
|
* Rework cmake flatc codegeneration (#7938)
|
||||||
|
* remove defining generated files in test srcs
|
||||||
|
* Add binary schema reflection (#7932)
|
||||||
|
* Migrate from rules_nodejs to rules_js/rules_ts (take 2) (#7928)
|
||||||
|
* `flat_buffers.dart`: mark const variable finals for internal Dart linters
|
||||||
|
* fixed some windows warnings (#7929)
|
||||||
|
* inject no long for FBS generation to remove logs in flattests (#7926)
|
||||||
|
* Revert "Migrate from rules_nodejs to rules_js/rules_ts (#7923)" (#7927)
|
||||||
|
* Migrate from rules_nodejs to rules_js/rules_ts (#7923)
|
||||||
|
* Only generate @kotlin.ExperimentalUnsigned annotation on create*Vector methods having an unsigned array type parameter. (#7881)
|
||||||
|
* additional check for absl::string_view availability (#7897)
|
||||||
|
* Optionally generate Python type annotations (#7858)
|
||||||
|
* Replace deprecated command with environment file (#7921)
|
||||||
|
* drop glibc from runtime dependencies (#7906)
|
||||||
|
* Make JSON supporting advanced union features (#7869)
|
||||||
|
* Allow to use functions from `BuildFlatBuffers.cmake` from a flatbuffers installation installed with CMake. (#7912)
|
||||||
|
* TS/JS: Use TypeError instead of Error when appropriate (#7910)
|
||||||
|
* Go: make generated code more compliant to "go fmt" (#7907)
|
||||||
|
* Support file_identifier in Go (#7904)
|
||||||
|
* Optionally generate type prefixes and suffixes for python code (#7857)
|
||||||
|
* Go: add test for FinishWithFileIdentifier (#7905)
|
||||||
|
* Fix go_sample.sh (#7903)
|
||||||
|
* [TS/JS] Upgrade dependencies (#7889)
|
||||||
|
* Add a FileWriter interface (#7821)
|
||||||
|
* TS/JS: Use minvalue from enum if not found (#7888)
|
||||||
|
* [CS] Verifier (#7850)
|
||||||
|
* README.md: PyPI case typo (#7880)
|
||||||
|
* Update go documentation link to point to root module (#7879)
|
||||||
|
* use Bool for flatbuffers bool instead of Byte (#7876)
|
||||||
|
* fix using null string in vector (#7872)
|
||||||
|
* Add `flatbuffers-64` branch to CI for pushes
|
||||||
|
* made changes to the rust docs so they would compile. new_with_capacity is deprecated should use with_capacity, get_root_as_monster should be root_as_monster (#7871)
|
||||||
|
* Adding comment for code clarification (#7856)
|
||||||
|
* ToCamelCase() when kLowerCamel now converts first char to lower. (#7838)
|
||||||
|
* Fix help output for --java-checkerframework (#7854)
|
||||||
|
* Update filename to README.md and improve formatting (#7855)
|
||||||
|
* Update stale.yml
|
||||||
|
* Updated remaining usages of LICENSE.txt
|
||||||
|
|
||||||
|
## [23.3.3 (Mar 3 2023)](https://github.com/google/flatbuffers/releases/tag/v23.3.3)
|
||||||
|
|
||||||
|
* Refactoring of `flatc` generators to use an interface (#7797).
|
||||||
|
|
||||||
|
* Removed legacy cmake support and set min to 3.8 (#7801).
|
||||||
|
|
||||||
|
## [23.1.21 (Jan 21 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.20)
|
||||||
|
|
||||||
|
* Reworked entry points for Typescript/Javascript and compatibility for single
|
||||||
|
file build (#7510)
|
||||||
|
|
||||||
|
## [23.1.20 (Jan 20 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.20)
|
||||||
|
|
||||||
|
* Removed go.mod files after some versioning issues were being report (#7780).
|
||||||
|
|
||||||
|
## [23.1.4 (Jan 4 2023)](https://github.com/google/flatbuffers/releases/tag/v23.1.4)
|
||||||
|
|
||||||
|
* Major release! Just kidding, we are continuing the
|
||||||
|
[versioning scheme](https://github.com/google/flatbuffers/wiki/Versioning) of
|
||||||
|
using a date to signify releases. This results in the first release of the new
|
||||||
|
year to bump the tradition major version field.
|
||||||
|
|
||||||
|
* Go minimum version is now 1.19 (#7720) with the addition of Go modules.
|
||||||
|
|
||||||
|
* Added CI support for Big Endian regression testing (#7707).
|
||||||
|
|
||||||
|
* Fixed `getFullyQualifiedName` in typescript to return name delimited by '.'
|
||||||
|
instead of '_' (#7730).
|
||||||
|
|
||||||
|
* Fixed the versioning scheme to not include leading zeros which are not
|
||||||
|
consistently handled by every package manager. Only the last release
|
||||||
|
(12.12.06) should have suffered from this.
|
||||||
|
|
||||||
|
## [22.12.06 (Dec 06 2022)](https://github.com/google/flatbuffers/releases/tag/v22.12.06)
|
||||||
|
|
||||||
|
* Bug fixing release, no major changes.
|
||||||
|
|
||||||
|
## [22.10.25 (Oct 25 2022)](https://github.com/google/flatbuffers/releases/tag/v22.10.25)
|
||||||
|
|
||||||
|
* Added Nim language support with generator and runtime libraries (#7534).
|
||||||
|
|
||||||
|
## [22.9.29 (Sept 29 2022)](https://github.com/google/flatbuffers/releases/tag/v22.9.29)
|
||||||
|
|
||||||
|
* Rust soundness fixes to avoid the crate from bing labelled unsafe (#7518).
|
||||||
|
|
||||||
|
## [22.9.24 (Sept 24 2022)](https://github.com/google/flatbuffers/releases/tag/v22.9.24)
|
||||||
|
|
||||||
|
* 20 Major releases in a row? Nope, we switched to a new
|
||||||
|
[versioning scheme](https://github.com/google/flatbuffers/wiki/Versioning)
|
||||||
|
that is based on date.
|
||||||
|
|
||||||
|
* Python supports fixed size arrays now (#7529).
|
||||||
|
|
||||||
|
* Behavior change in how C++ object API uses `UnPackTo`. The original intent of
|
||||||
|
this was to reduce allocations by reusing an existing object to pack data
|
||||||
|
into. At some point, this logic started to merge the states of the two objects
|
||||||
|
instead of clearing the state of the packee. This change goes back to the
|
||||||
|
original intention, the packed object is cleared when getting data packed into
|
||||||
|
it (#7527).
|
||||||
|
|
||||||
|
* Fixed a bug in C++ alignment that was using `sizeof()` instead of the intended
|
||||||
|
`AlignOf()` for structs (#7520).
|
||||||
|
|
||||||
|
* C# has an
|
||||||
|
[official Nuget package](https://www.nuget.org/packages/Google.FlatBuffers)
|
||||||
|
now (#7496).
|
||||||
|
|
||||||
|
## 2.0.8 (Aug 29 2022)
|
||||||
|
|
||||||
|
* Fix for `--keep-prefix` the was generating the wrong include statements for
|
||||||
|
C++ (#7469). The bug was introduced in 2.0.7.
|
||||||
|
|
||||||
|
* Added the `Verifier::Options` option struct to allow specifying runtime
|
||||||
|
configuration settings for the verifier (#7489). This allows to skip verifying
|
||||||
|
nested flatbuffers, a on-by-default change that was introduced in 2.0.7. This
|
||||||
|
deprecates the existing `Verifier` constructor, which may be removed in a
|
||||||
|
future version.
|
||||||
|
|
||||||
|
* Refactor of `tests/test.cpp` that lead to ~10% speedup in compilation of the
|
||||||
|
entire project (#7487).
|
||||||
|
|
||||||
|
## 2.0.7 (Aug 22 2022)
|
||||||
|
|
||||||
|
* This is the first version with an explicit change log, so all the previous
|
||||||
|
features will not be listed.
|
||||||
|
|
||||||
|
* Verifier now checks that buffers are at least the minimum size required to be
|
||||||
|
a flatbuffers (12 bytes). This includes nested flatbuffers, which previously
|
||||||
|
could be declared valid at size 0.
|
||||||
|
|
||||||
|
* Annotated binaries. Given a flatbuffer binary and a schema (or binary schema)
|
||||||
|
one can generate an annotated flatbuffer (.afb) to describe each byte in the
|
||||||
|
binary with schema metadata and value.
|
||||||
|
|
||||||
|
* First binary schema generator (Lua) to generate Lua code via a .bfbs file.
|
||||||
|
This is mostly an implementation detail of flatc internals, but will be slowly
|
||||||
|
applied to the other language generators.
|
||||||
449
third_party/flatbuffers/CMake/BuildFlatBuffers.cmake
vendored
Normal file
449
third_party/flatbuffers/CMake/BuildFlatBuffers.cmake
vendored
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
# Copyright 2015 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# General function to create FlatBuffer build rules for the given list of
|
||||||
|
# schemas.
|
||||||
|
#
|
||||||
|
# flatbuffers_schemas: A list of flatbuffer schema files to process.
|
||||||
|
#
|
||||||
|
# schema_include_dirs: A list of schema file include directories, which will be
|
||||||
|
# passed to flatc via the -I parameter.
|
||||||
|
#
|
||||||
|
# custom_target_name: The generated files will be added as dependencies for a
|
||||||
|
# new custom target with this name. You should add that target as a dependency
|
||||||
|
# for your main target to ensure these files are built. You can also retrieve
|
||||||
|
# various properties from this target, such as GENERATED_INCLUDES_DIR,
|
||||||
|
# BINARY_SCHEMAS_DIR, and COPY_TEXT_SCHEMAS_DIR.
|
||||||
|
#
|
||||||
|
# additional_dependencies: A list of additional dependencies that you'd like
|
||||||
|
# all generated files to depend on. Pass in a blank string if you have none.
|
||||||
|
#
|
||||||
|
# generated_includes_dir: Where to generate the C++ header files for these
|
||||||
|
# schemas. The generated includes directory will automatically be added to
|
||||||
|
# CMake's include directories, and will be where generated header files are
|
||||||
|
# placed. This parameter is optional; pass in empty string if you don't want to
|
||||||
|
# generate include files for these schemas.
|
||||||
|
#
|
||||||
|
# binary_schemas_dir: If you specify an optional binary schema directory, binary
|
||||||
|
# schemas will be generated for these schemas as well, and placed into the given
|
||||||
|
# directory.
|
||||||
|
#
|
||||||
|
# copy_text_schemas_dir: If you want all text schemas (including schemas from
|
||||||
|
# all schema include directories) copied into a directory (for example, if you
|
||||||
|
# need them within your project to build JSON files), you can specify that
|
||||||
|
# folder here. All text schemas will be copied to that folder.
|
||||||
|
#
|
||||||
|
# IMPORTANT: Make sure you quote all list arguments you pass to this function!
|
||||||
|
# Otherwise CMake will only pass in the first element.
|
||||||
|
# Example: build_flatbuffers("${fb_files}" "${include_dirs}" target_name ...)
|
||||||
|
function(build_flatbuffers flatbuffers_schemas
|
||||||
|
schema_include_dirs
|
||||||
|
custom_target_name
|
||||||
|
additional_dependencies
|
||||||
|
generated_includes_dir
|
||||||
|
binary_schemas_dir
|
||||||
|
copy_text_schemas_dir)
|
||||||
|
|
||||||
|
# Test if including from FindFlatBuffers
|
||||||
|
if(FLATBUFFERS_FLATC_EXECUTABLE)
|
||||||
|
set(FLATC_TARGET "")
|
||||||
|
set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
|
||||||
|
elseif(TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC_TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC flatbuffers::flatc)
|
||||||
|
else()
|
||||||
|
set(FLATC_TARGET flatc)
|
||||||
|
set(FLATC flatc)
|
||||||
|
endif()
|
||||||
|
set(FLATC_SCHEMA_ARGS --gen-mutable)
|
||||||
|
if(FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS)
|
||||||
|
set(FLATC_SCHEMA_ARGS
|
||||||
|
${FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS}
|
||||||
|
${FLATC_SCHEMA_ARGS}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
|
||||||
|
set(schema_glob "*.fbs")
|
||||||
|
# Generate the include files parameters.
|
||||||
|
set(include_params "")
|
||||||
|
set(all_generated_files "")
|
||||||
|
foreach (include_dir ${schema_include_dirs})
|
||||||
|
set(include_params -I ${include_dir} ${include_params})
|
||||||
|
if (NOT ${copy_text_schemas_dir} STREQUAL "")
|
||||||
|
# Copy text schemas from dependent folders.
|
||||||
|
file(GLOB_RECURSE dependent_schemas ${include_dir}/${schema_glob})
|
||||||
|
foreach (dependent_schema ${dependent_schemas})
|
||||||
|
file(COPY ${dependent_schema} DESTINATION ${copy_text_schemas_dir})
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
foreach(schema ${flatbuffers_schemas})
|
||||||
|
get_filename_component(filename ${schema} NAME_WE)
|
||||||
|
# For each schema, do the things we requested.
|
||||||
|
if (NOT ${generated_includes_dir} STREQUAL "")
|
||||||
|
set(generated_include ${generated_includes_dir}/${filename}_generated.h)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${generated_include}
|
||||||
|
COMMAND ${FLATC} ${FLATC_SCHEMA_ARGS}
|
||||||
|
-o ${generated_includes_dir}
|
||||||
|
${include_params}
|
||||||
|
-c ${schema}
|
||||||
|
DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}
|
||||||
|
WORKING_DIRECTORY "${working_dir}")
|
||||||
|
list(APPEND all_generated_files ${generated_include})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ${binary_schemas_dir} STREQUAL "")
|
||||||
|
set(binary_schema ${binary_schemas_dir}/${filename}.bfbs)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${binary_schema}
|
||||||
|
COMMAND ${FLATC} -b --schema
|
||||||
|
-o ${binary_schemas_dir}
|
||||||
|
${include_params}
|
||||||
|
${schema}
|
||||||
|
DEPENDS ${FLATC_TARGET} ${schema} ${additional_dependencies}
|
||||||
|
WORKING_DIRECTORY "${working_dir}")
|
||||||
|
list(APPEND all_generated_files ${binary_schema})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ${copy_text_schemas_dir} STREQUAL "")
|
||||||
|
file(COPY ${schema} DESTINATION ${copy_text_schemas_dir})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Create a custom target that depends on all the generated files.
|
||||||
|
# This is the target that you can depend on to trigger all these
|
||||||
|
# to be built.
|
||||||
|
add_custom_target(${custom_target_name}
|
||||||
|
DEPENDS ${all_generated_files} ${additional_dependencies})
|
||||||
|
|
||||||
|
# Register the include directory we are using.
|
||||||
|
if (NOT ${generated_includes_dir} STREQUAL "")
|
||||||
|
include_directories(${generated_includes_dir})
|
||||||
|
set_property(TARGET ${custom_target_name}
|
||||||
|
PROPERTY GENERATED_INCLUDES_DIR
|
||||||
|
${generated_includes_dir})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Register the binary schemas dir we are using.
|
||||||
|
if (NOT ${binary_schemas_dir} STREQUAL "")
|
||||||
|
set_property(TARGET ${custom_target_name}
|
||||||
|
PROPERTY BINARY_SCHEMAS_DIR
|
||||||
|
${binary_schemas_dir})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Register the text schema copy dir we are using.
|
||||||
|
if (NOT ${copy_text_schemas_dir} STREQUAL "")
|
||||||
|
set_property(TARGET ${custom_target_name}
|
||||||
|
PROPERTY COPY_TEXT_SCHEMAS_DIR
|
||||||
|
${copy_text_schemas_dir})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Creates a target that can be linked against that generates flatbuffer headers.
|
||||||
|
#
|
||||||
|
# This function takes a target name and a list of schemas. You can also specify
|
||||||
|
# other flagc flags using the FLAGS option to change the behavior of the flatc
|
||||||
|
# tool.
|
||||||
|
#
|
||||||
|
# When the target_link_libraries is done within a different directory than
|
||||||
|
# flatbuffers_generate_headers is called, then the target should also be dependent
|
||||||
|
# the custom generation target called GENERATE_<TARGET>.
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# TARGET: The name of the target to generate.
|
||||||
|
# SCHEMAS: The list of schema files to generate code for.
|
||||||
|
# BINARY_SCHEMAS_DIR: Optional. The directory in which to generate binary
|
||||||
|
# schemas. Binary schemas will only be generated if a path is provided.
|
||||||
|
# INCLUDE: Optional. Search for includes in the specified paths. (Use this
|
||||||
|
# instead of "-I <path>" and the FLAGS option so that CMake is aware of
|
||||||
|
# the directories that need to be searched).
|
||||||
|
# INCLUDE_PREFIX: Optional. The directory in which to place the generated
|
||||||
|
# files. Use this instead of the --include-prefix option.
|
||||||
|
# FLAGS: Optional. A list of any additional flags that you would like to pass
|
||||||
|
# to flatc.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# flatbuffers_generate_headers(
|
||||||
|
# TARGET my_generated_headers_target
|
||||||
|
# INCLUDE_PREFIX ${MY_INCLUDE_PREFIX}"
|
||||||
|
# SCHEMAS ${MY_SCHEMA_FILES}
|
||||||
|
# BINARY_SCHEMAS_DIR "${MY_BINARY_SCHEMA_DIRECTORY}"
|
||||||
|
# FLAGS --gen-object-api)
|
||||||
|
#
|
||||||
|
# target_link_libraries(MyExecutableTarget
|
||||||
|
# PRIVATE my_generated_headers_target
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# Optional (only needed within different directory):
|
||||||
|
# add_dependencies(app GENERATE_my_generated_headers_target)
|
||||||
|
function(flatbuffers_generate_headers)
|
||||||
|
# Parse function arguments.
|
||||||
|
set(options)
|
||||||
|
set(one_value_args
|
||||||
|
"TARGET"
|
||||||
|
"INCLUDE_PREFIX"
|
||||||
|
"BINARY_SCHEMAS_DIR")
|
||||||
|
set(multi_value_args
|
||||||
|
"SCHEMAS"
|
||||||
|
"INCLUDE"
|
||||||
|
"FLAGS")
|
||||||
|
cmake_parse_arguments(
|
||||||
|
PARSE_ARGV 0
|
||||||
|
FLATBUFFERS_GENERATE_HEADERS
|
||||||
|
"${options}"
|
||||||
|
"${one_value_args}"
|
||||||
|
"${multi_value_args}")
|
||||||
|
|
||||||
|
# Test if including from FindFlatBuffers
|
||||||
|
if(FLATBUFFERS_FLATC_EXECUTABLE)
|
||||||
|
set(FLATC_TARGET "")
|
||||||
|
set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
|
||||||
|
elseif(TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC_TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC flatbuffers::flatc)
|
||||||
|
else()
|
||||||
|
set(FLATC_TARGET flatc)
|
||||||
|
set(FLATC flatc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
|
||||||
|
# Generate the include files parameters.
|
||||||
|
set(include_params "")
|
||||||
|
foreach (include_dir ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE})
|
||||||
|
set(include_params -I ${include_dir} ${include_params})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Create a directory to place the generated code.
|
||||||
|
set(generated_target_dir "${CMAKE_CURRENT_BINARY_DIR}/${FLATBUFFERS_GENERATE_HEADERS_TARGET}")
|
||||||
|
set(generated_include_dir "${generated_target_dir}")
|
||||||
|
if (NOT ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX} STREQUAL "")
|
||||||
|
set(generated_include_dir "${generated_include_dir}/${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX}")
|
||||||
|
list(APPEND FLATBUFFERS_GENERATE_HEADERS_FLAGS
|
||||||
|
"--include-prefix" ${FLATBUFFERS_GENERATE_HEADERS_INCLUDE_PREFIX})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(generated_custom_commands)
|
||||||
|
|
||||||
|
# Create rules to generate the code for each schema.
|
||||||
|
foreach(schema ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
|
get_filename_component(filename ${schema} NAME_WE)
|
||||||
|
set(generated_include "${generated_include_dir}/${filename}_generated.h")
|
||||||
|
|
||||||
|
# Generate files for grpc if needed
|
||||||
|
set(generated_source_file)
|
||||||
|
if("${FLATBUFFERS_GENERATE_HEADERS_FLAGS}" MATCHES "--grpc")
|
||||||
|
# Check if schema file contain a rpc_service definition
|
||||||
|
file(STRINGS ${schema} has_grpc REGEX "rpc_service")
|
||||||
|
if(has_grpc)
|
||||||
|
list(APPEND generated_include "${generated_include_dir}/${filename}.grpc.fb.h")
|
||||||
|
set(generated_source_file "${generated_include_dir}/${filename}.grpc.fb.cc")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${generated_include} ${generated_source_file}
|
||||||
|
COMMAND ${FLATC} ${FLATC_ARGS}
|
||||||
|
-o ${generated_include_dir}
|
||||||
|
${include_params}
|
||||||
|
-c ${schema}
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_FLAGS}
|
||||||
|
DEPENDS ${FLATC_TARGET} ${schema}
|
||||||
|
WORKING_DIRECTORY "${working_dir}"
|
||||||
|
COMMENT "Building ${schema} flatbuffers...")
|
||||||
|
list(APPEND all_generated_header_files ${generated_include})
|
||||||
|
list(APPEND all_generated_source_files ${generated_source_file})
|
||||||
|
list(APPEND generated_custom_commands "${generated_include}" "${generated_source_file}")
|
||||||
|
|
||||||
|
# Geneate the binary flatbuffers schemas if instructed to.
|
||||||
|
if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL "")
|
||||||
|
set(binary_schema
|
||||||
|
"${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}/${filename}.bfbs")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${binary_schema}
|
||||||
|
COMMAND ${FLATC} -b --schema
|
||||||
|
-o ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}
|
||||||
|
${include_params}
|
||||||
|
${schema}
|
||||||
|
DEPENDS ${FLATC_TARGET} ${schema}
|
||||||
|
WORKING_DIRECTORY "${working_dir}")
|
||||||
|
list(APPEND generated_custom_commands "${binary_schema}")
|
||||||
|
list(APPEND all_generated_binary_files ${binary_schema})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Create an additional target as add_custom_command scope is only within same directory (CMakeFile.txt)
|
||||||
|
set(generate_target GENERATE_${FLATBUFFERS_GENERATE_HEADERS_TARGET})
|
||||||
|
add_custom_target(${generate_target} ALL
|
||||||
|
DEPENDS ${generated_custom_commands}
|
||||||
|
COMMENT "Generating flatbuffer target ${FLATBUFFERS_GENERATE_HEADERS_TARGET}")
|
||||||
|
|
||||||
|
# Set up interface library
|
||||||
|
add_library(${FLATBUFFERS_GENERATE_HEADERS_TARGET} INTERFACE)
|
||||||
|
target_sources(
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
||||||
|
INTERFACE
|
||||||
|
${all_generated_header_files}
|
||||||
|
${all_generated_binary_files}
|
||||||
|
${all_generated_source_files}
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
|
add_dependencies(
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
||||||
|
${FLATC}
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
|
target_include_directories(
|
||||||
|
${FLATBUFFERS_GENERATE_HEADERS_TARGET}
|
||||||
|
INTERFACE ${generated_target_dir})
|
||||||
|
|
||||||
|
# Organize file layout for IDEs.
|
||||||
|
source_group(
|
||||||
|
TREE "${generated_target_dir}"
|
||||||
|
PREFIX "Flatbuffers/Generated/Headers Files"
|
||||||
|
FILES ${all_generated_header_files})
|
||||||
|
source_group(
|
||||||
|
TREE "${generated_target_dir}"
|
||||||
|
PREFIX "Flatbuffers/Generated/Source Files"
|
||||||
|
FILES ${all_generated_source_files})
|
||||||
|
source_group(
|
||||||
|
TREE ${working_dir}
|
||||||
|
PREFIX "Flatbuffers/Schemas"
|
||||||
|
FILES ${FLATBUFFERS_GENERATE_HEADERS_SCHEMAS})
|
||||||
|
if (NOT ${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR} STREQUAL "")
|
||||||
|
source_group(
|
||||||
|
TREE "${FLATBUFFERS_GENERATE_HEADERS_BINARY_SCHEMAS_DIR}"
|
||||||
|
PREFIX "Flatbuffers/Generated/Binary Schemas"
|
||||||
|
FILES ${all_generated_binary_files})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Creates a target that can be linked against that generates flatbuffer binaries
|
||||||
|
# from json files.
|
||||||
|
#
|
||||||
|
# This function takes a target name and a list of schemas and Json files. You
|
||||||
|
# can also specify other flagc flags and options to change the behavior of the
|
||||||
|
# flatc compiler.
|
||||||
|
#
|
||||||
|
# Adding this target to your executable ensurses that the flatbuffer binaries
|
||||||
|
# are compiled before your executable is run.
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# TARGET: The name of the target to generate.
|
||||||
|
# JSON_FILES: The list of json files to compile to flatbuffers binaries.
|
||||||
|
# SCHEMA: The flatbuffers schema of the Json files to be compiled.
|
||||||
|
# INCLUDE: Optional. Search for includes in the specified paths. (Use this
|
||||||
|
# instead of "-I <path>" and the FLAGS option so that CMake is aware of
|
||||||
|
# the directories that need to be searched).
|
||||||
|
# OUTPUT_DIR: The directly where the generated flatbuffers binaries should be
|
||||||
|
# placed.
|
||||||
|
# FLAGS: Optional. A list of any additional flags that you would like to pass
|
||||||
|
# to flatc.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# flatbuffers_generate_binary_files(
|
||||||
|
# TARGET my_binary_data
|
||||||
|
# SCHEMA "${MY_SCHEMA_DIR}/my_example_schema.fbs"
|
||||||
|
# JSON_FILES ${MY_JSON_FILES}
|
||||||
|
# OUTPUT_DIR "${MY_BINARY_DATA_DIRECTORY}"
|
||||||
|
# FLAGS --strict-json)
|
||||||
|
#
|
||||||
|
# target_link_libraries(MyExecutableTarget
|
||||||
|
# PRIVATE my_binary_data
|
||||||
|
# )
|
||||||
|
function(flatbuffers_generate_binary_files)
|
||||||
|
# Parse function arguments.
|
||||||
|
set(options)
|
||||||
|
set(one_value_args
|
||||||
|
"TARGET"
|
||||||
|
"SCHEMA"
|
||||||
|
"OUTPUT_DIR")
|
||||||
|
set(multi_value_args
|
||||||
|
"JSON_FILES"
|
||||||
|
"INCLUDE"
|
||||||
|
"FLAGS")
|
||||||
|
cmake_parse_arguments(
|
||||||
|
PARSE_ARGV 0
|
||||||
|
FLATBUFFERS_GENERATE_BINARY_FILES
|
||||||
|
"${options}"
|
||||||
|
"${one_value_args}"
|
||||||
|
"${multi_value_args}")
|
||||||
|
|
||||||
|
# Test if including from FindFlatBuffers
|
||||||
|
if(FLATBUFFERS_FLATC_EXECUTABLE)
|
||||||
|
set(FLATC_TARGET "")
|
||||||
|
set(FLATC ${FLATBUFFERS_FLATC_EXECUTABLE})
|
||||||
|
elseif(TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC_TARGET flatbuffers::flatc)
|
||||||
|
set(FLATC flatbuffers::flatc)
|
||||||
|
else()
|
||||||
|
set(FLATC_TARGET flatc)
|
||||||
|
set(FLATC flatc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
|
||||||
|
# Generate the include files parameters.
|
||||||
|
set(include_params "")
|
||||||
|
foreach (include_dir ${FLATBUFFERS_GENERATE_BINARY_FILES_INCLUDE})
|
||||||
|
set(include_params -I ${include_dir} ${include_params})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Create rules to generate the flatbuffers binary for each json file.
|
||||||
|
foreach(json_file ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})
|
||||||
|
get_filename_component(filename ${json_file} NAME_WE)
|
||||||
|
set(generated_binary_file "${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}/${filename}.bin")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${generated_binary_file}
|
||||||
|
COMMAND ${FLATC} ${FLATC_ARGS}
|
||||||
|
-o ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}
|
||||||
|
${include_params}
|
||||||
|
-b ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA} ${json_file}
|
||||||
|
${FLATBUFFERS_GENERATE_BINARY_FILES_FLAGS}
|
||||||
|
DEPENDS ${FLATC_TARGET} ${json_file}
|
||||||
|
WORKING_DIRECTORY "${working_dir}"
|
||||||
|
COMMENT "Building ${json_file} binary flatbuffers...")
|
||||||
|
list(APPEND all_generated_binary_files ${generated_binary_file})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Set up interface library
|
||||||
|
add_library(${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET} INTERFACE)
|
||||||
|
target_sources(
|
||||||
|
${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}
|
||||||
|
INTERFACE
|
||||||
|
${all_generated_binary_files}
|
||||||
|
${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES}
|
||||||
|
${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})
|
||||||
|
add_dependencies(
|
||||||
|
${FLATBUFFERS_GENERATE_BINARY_FILES_TARGET}
|
||||||
|
${FLATC})
|
||||||
|
|
||||||
|
# Organize file layout for IDEs.
|
||||||
|
source_group(
|
||||||
|
TREE ${working_dir}
|
||||||
|
PREFIX "Flatbuffers/JSON Files"
|
||||||
|
FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_JSON_FILES})
|
||||||
|
source_group(
|
||||||
|
TREE ${working_dir}
|
||||||
|
PREFIX "Flatbuffers/Schemas"
|
||||||
|
FILES ${FLATBUFFERS_GENERATE_BINARY_FILES_SCHEMA})
|
||||||
|
source_group(
|
||||||
|
TREE ${FLATBUFFERS_GENERATE_BINARY_FILES_OUTPUT_DIR}
|
||||||
|
PREFIX "Flatbuffers/Generated/Binary Files"
|
||||||
|
FILES ${all_generated_binary_files})
|
||||||
|
endfunction()
|
||||||
4
third_party/flatbuffers/CMake/DESCRIPTION.txt
vendored
Normal file
4
third_party/flatbuffers/CMake/DESCRIPTION.txt
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FlatBuffers is a cross platform serialization library architected for
|
||||||
|
maximum memory efficiency. It allows you to directly access serialized
|
||||||
|
data without parsing/unpacking it first, while still having great
|
||||||
|
forwards/backwards compatibility.
|
||||||
61
third_party/flatbuffers/CMake/FindFlatBuffers.cmake
vendored
Normal file
61
third_party/flatbuffers/CMake/FindFlatBuffers.cmake
vendored
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# Copyright 2014 Stefan.Eilemann@epfl.ch
|
||||||
|
# Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# Find the flatbuffers schema compiler
|
||||||
|
#
|
||||||
|
# Output Variables:
|
||||||
|
# * FLATBUFFERS_FLATC_EXECUTABLE the flatc compiler executable
|
||||||
|
# * FLATBUFFERS_FOUND
|
||||||
|
#
|
||||||
|
# Provides:
|
||||||
|
# * FLATBUFFERS_GENERATE_C_HEADERS(Name <files>) creates the C++ headers
|
||||||
|
# for the given flatbuffer schema files.
|
||||||
|
# Returns the header files in ${Name}_OUTPUTS
|
||||||
|
|
||||||
|
set(FLATBUFFERS_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
|
||||||
|
find_program(FLATBUFFERS_FLATC_EXECUTABLE NAMES flatc)
|
||||||
|
find_path(FLATBUFFERS_INCLUDE_DIR NAMES flatbuffers/flatbuffers.h)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(FlatBuffers
|
||||||
|
DEFAULT_MSG FLATBUFFERS_FLATC_EXECUTABLE FLATBUFFERS_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_FOUND)
|
||||||
|
function(FLATBUFFERS_GENERATE_C_HEADERS Name)
|
||||||
|
set(FLATC_OUTPUTS)
|
||||||
|
foreach(FILE ${ARGN})
|
||||||
|
get_filename_component(FLATC_OUTPUT ${FILE} NAME_WE)
|
||||||
|
set(FLATC_OUTPUT
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${FLATC_OUTPUT}_generated.h")
|
||||||
|
list(APPEND FLATC_OUTPUTS ${FLATC_OUTPUT})
|
||||||
|
|
||||||
|
add_custom_command(OUTPUT ${FLATC_OUTPUT}
|
||||||
|
COMMAND ${FLATBUFFERS_FLATC_EXECUTABLE}
|
||||||
|
ARGS -c -o "${CMAKE_CURRENT_BINARY_DIR}/" ${FILE}
|
||||||
|
DEPENDS ${FILE}
|
||||||
|
COMMENT "Building C++ header for ${FILE}"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
endforeach()
|
||||||
|
set(${Name}_OUTPUTS ${FLATC_OUTPUTS} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
set(FLATBUFFERS_INCLUDE_DIRS ${FLATBUFFERS_INCLUDE_DIR})
|
||||||
|
include_directories(${CMAKE_BINARY_DIR})
|
||||||
|
else()
|
||||||
|
set(FLATBUFFERS_INCLUDE_DIR)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include("${FLATBUFFERS_CMAKE_DIR}/BuildFlatBuffers.cmake")
|
||||||
25
third_party/flatbuffers/CMake/PackageDebian.cmake
vendored
Normal file
25
third_party/flatbuffers/CMake/PackageDebian.cmake
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# ------------------- Debianization ---------------------
|
||||||
|
if (UNIX)
|
||||||
|
|
||||||
|
# Set build environment
|
||||||
|
SET(CPACK_GENERATOR "TGZ;DEB")
|
||||||
|
SET(CPACK_SOURCE_TGZ "ON")
|
||||||
|
|
||||||
|
# Common package information
|
||||||
|
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
||||||
|
"FlatBuffers is an efficient cross platform serialization library for C++, with support for Java, C# and Go. It was created at Google specifically for game development and other performance-critical applications.")
|
||||||
|
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/google/flatbuffers")
|
||||||
|
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Vitaly Isaev <vitalyisaev2@gmail.com>")
|
||||||
|
|
||||||
|
SET(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
|
||||||
|
SET(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
|
||||||
|
SET(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
|
||||||
|
SET(CPACK_PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_COMMIT}")
|
||||||
|
SET(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
|
||||||
|
|
||||||
|
# Package name
|
||||||
|
SET(CPACK_DEBIAN_PACKAGE_NAME "flatbuffers")
|
||||||
|
SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)
|
||||||
|
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
|
||||||
|
|
||||||
|
endif(UNIX)
|
||||||
44
third_party/flatbuffers/CMake/PackageRedhat.cmake
vendored
Normal file
44
third_party/flatbuffers/CMake/PackageRedhat.cmake
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
if (UNIX)
|
||||||
|
set(CPACK_GENERATOR "RPM")
|
||||||
|
set(CPACK_SOURCE_TGZ "ON")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "FlatBuffers serialization library and schema compiler.")
|
||||||
|
|
||||||
|
set(CPACK_RPM_PACKAGE_HOMEPAGE "https://github.com/google/flatbuffers")
|
||||||
|
set(CPACK_RPM_PACKAGE_MAINTAINER "Marc Butler <mockbutler@gmail.com>")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
|
||||||
|
set(CPACK_PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_COMMIT}")
|
||||||
|
set(CPACK_RPM_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
|
||||||
|
|
||||||
|
set(CPACK_RPM_PACKAGE_NAME "flatbuffers")
|
||||||
|
|
||||||
|
# Assume this is not a cross compilation build.
|
||||||
|
if(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)
|
||||||
|
set(CPACK_RPM_PACKAGE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
|
endif(NOT CPACK_RPM_PACKAGE_ARCHITECTURE)
|
||||||
|
|
||||||
|
set(CPACK_RPM_PACKAGE_VENDOR "Google, Inc.")
|
||||||
|
set(CPACK_RPM_PACKAGE_LICENSE "Apache 2.0")
|
||||||
|
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE)
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/CMake/DESCRIPTION.txt)
|
||||||
|
|
||||||
|
# This may reduce rpm compatiblity with very old systems.
|
||||||
|
set(CPACK_RPM_COMPRESSION_TYPE lzma)
|
||||||
|
|
||||||
|
set(CPACK_RPM_PACKAGE_NAME "flatbuffers")
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
|
"${CPACK_RPM_PACKAGE_NAME}_${CPACK_RPM_PACKAGE_VERSION}_${CPACK_RPM_PACKAGE_ARCHITECTURE}")
|
||||||
|
if(NOT DEFINED ${CPACK_PACKAGING_INSTALL_PREFIX})
|
||||||
|
# Default packaging install prefix on RedHat systems is /usr.
|
||||||
|
# This is the assumed value when this variable is not defined.
|
||||||
|
# There is currently a conflict with
|
||||||
|
# /usr/${CMAKE_INSTALL_LIBDIR}/cmake which is installed by default
|
||||||
|
# by other packages on RedHat (most notably cmake-filesystem). Ensure
|
||||||
|
# that on these systems, flatbuffers does not package this path.
|
||||||
|
# This patch is required for cmake pre-3.17.
|
||||||
|
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/${CMAKE_INSTALL_LIBDIR}/cmake")
|
||||||
|
endif()
|
||||||
|
endif(UNIX)
|
||||||
39
third_party/flatbuffers/CMake/Version.cmake
vendored
Normal file
39
third_party/flatbuffers/CMake/Version.cmake
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
set(VERSION_MAJOR 24)
|
||||||
|
set(VERSION_MINOR 3)
|
||||||
|
set(VERSION_PATCH 25)
|
||||||
|
set(VERSION_COMMIT 0)
|
||||||
|
|
||||||
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
|
find_program(GIT git)
|
||||||
|
if(GIT)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT} describe --tags
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_DESCRIBE_DIRTY
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
RESULT_VARIABLE GIT_DESCRIBE_RESULT
|
||||||
|
)
|
||||||
|
|
||||||
|
if(GIT_DESCRIBE_RESULT EQUAL 0)
|
||||||
|
# Test if the most recent Git tag matches the pattern "v<major>.<minor>.<patch>*"
|
||||||
|
if(GIT_DESCRIBE_DIRTY MATCHES "^v[0-9]+\\.[0-9]+\\.[0-9]+.*")
|
||||||
|
string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${GIT_DESCRIBE_DIRTY}")
|
||||||
|
string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${GIT_DESCRIBE_DIRTY}")
|
||||||
|
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${GIT_DESCRIBE_DIRTY}")
|
||||||
|
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+\\-([0-9]+).*" "\\1" VERSION_COMMIT "${GIT_DESCRIBE_DIRTY}")
|
||||||
|
# If the tag points to the commit, then only the tag is shown in "git describe"
|
||||||
|
if(VERSION_COMMIT STREQUAL GIT_DESCRIBE_DIRTY)
|
||||||
|
set(VERSION_COMMIT 0)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(WARNING "\"${GIT_DESCRIBE_DIRTY}\" does not match pattern v<major>.<minor>.<patch>-<commit>")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(WARNING "git describe failed with exit code: ${GIT_DESCRIBE_RESULT}\nMake sure you cloned with tags or run 'git fetch --tags'.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(WARNING "git is not found")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Proceeding with version: ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_COMMIT}")
|
||||||
11
third_party/flatbuffers/CMake/flatbuffers-config-version.cmake.in
vendored
Normal file
11
third_party/flatbuffers/CMake/flatbuffers-config-version.cmake.in
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
set(PACKAGE_VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@")
|
||||||
|
|
||||||
|
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
||||||
|
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||||
|
else()
|
||||||
|
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
||||||
|
if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
|
||||||
|
set(PACKAGE_VERSION_EXACT TRUE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
4
third_party/flatbuffers/CMake/flatbuffers-config.cmake
vendored
Normal file
4
third_party/flatbuffers/CMake/flatbuffers-config.cmake
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/FlatBuffersTargets.cmake" OPTIONAL)
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/FlatcTargets.cmake" OPTIONAL)
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/FlatBuffersSharedTargets.cmake" OPTIONAL)
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/BuildFlatBuffers.cmake" OPTIONAL)
|
||||||
9
third_party/flatbuffers/CMake/flatbuffers.pc.in
vendored
Normal file
9
third_party/flatbuffers/CMake/flatbuffers.pc.in
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
||||||
|
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||||
|
|
||||||
|
Name: FlatBuffers
|
||||||
|
Description: Memory Efficient Serialization Library
|
||||||
|
Version: @VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@
|
||||||
|
|
||||||
|
Libs: -L${libdir} -lflatbuffers
|
||||||
|
Cflags: -I${includedir}
|
||||||
718
third_party/flatbuffers/CMakeLists.txt
vendored
Normal file
718
third_party/flatbuffers/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,718 @@
|
|||||||
|
# This is the legacy minimum version flatbuffers supported for a while.
|
||||||
|
cmake_minimum_required(VERSION 3.8...3.25.2)
|
||||||
|
|
||||||
|
# Attempt to read the current version of flatbuffers by looking at the latest tag.
|
||||||
|
include(CMake/Version.cmake)
|
||||||
|
|
||||||
|
project(FlatBuffers
|
||||||
|
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
|
||||||
|
LANGUAGES CXX)
|
||||||
|
|
||||||
|
# generate compile_commands.json
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
|
# NOTE: Code coverage only works on Linux & OSX.
|
||||||
|
option(FLATBUFFERS_CODE_COVERAGE "Enable the code coverage build option." OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_TESTS "Enable the build of tests and samples." ON)
|
||||||
|
option(FLATBUFFERS_INSTALL "Enable the installation of targets." ON)
|
||||||
|
option(FLATBUFFERS_BUILD_FLATLIB "Enable the build of the flatbuffers library"
|
||||||
|
ON)
|
||||||
|
option(FLATBUFFERS_BUILD_FLATC "Enable the build of the flatbuffers compiler"
|
||||||
|
ON)
|
||||||
|
option(FLATBUFFERS_STATIC_FLATC "Build flatbuffers compiler with -static flag"
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_FLATHASH "Enable the build of flathash" OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_BENCHMARKS "Enable the build of flatbenchmark."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_GRPCTEST "Enable the build of grpctest" OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_SHAREDLIB
|
||||||
|
"Enable the build of the flatbuffers shared library"
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_LIBCXX_WITH_CLANG "Force libc++ when using Clang" ON)
|
||||||
|
# NOTE: Sanitizer check only works on Linux & OSX (gcc & llvm).
|
||||||
|
option(FLATBUFFERS_CODE_SANITIZE
|
||||||
|
"Add '-fsanitize' flags to 'flattests' and 'flatc' targets."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_PACKAGE_REDHAT
|
||||||
|
"Build an rpm using the 'package' target."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_PACKAGE_DEBIAN
|
||||||
|
"Build an deb using the 'package' target."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_CPP17
|
||||||
|
"Enable the build of c++17 test target. \"
|
||||||
|
Requirements: Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_BUILD_LEGACY
|
||||||
|
"Run C++ code generator with '--cpp-std c++0x' switch."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_ENABLE_PCH
|
||||||
|
"Enable precompile headers support for 'flatbuffers' and 'flatc'. \"
|
||||||
|
Only work if CMake supports 'target_precompile_headers'. \"
|
||||||
|
This can speed up compilation time."
|
||||||
|
OFF)
|
||||||
|
option(FLATBUFFERS_SKIP_MONSTER_EXTRA
|
||||||
|
"Skip generating monster_extra.fbs that contains non-supported numerical\"
|
||||||
|
types." OFF)
|
||||||
|
option(FLATBUFFERS_STRICT_MODE
|
||||||
|
"Build flatbuffers with all warnings as errors (-Werror or /WX)."
|
||||||
|
OFF)
|
||||||
|
|
||||||
|
if(NOT DEFINED FLATBUFFERS_CPP_STD)
|
||||||
|
set(FLATBUFFERS_CPP_STD 11)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(MSVC_LIKE OFF)
|
||||||
|
if(MSVC OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||||
|
set(MSVC_LIKE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
set(IS_CLANG ON)
|
||||||
|
else()
|
||||||
|
set(IS_CLANG OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED FLATBUFFERS_COMPILATION_TIMINGS)
|
||||||
|
message("Recording Compilation Timings to ${FLATBUFFERS_COMPILATION_TIMINGS}")
|
||||||
|
file(REMOVE ${FLATBUFFERS_COMPILATION_TIMINGS})
|
||||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
|
||||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
|
||||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "time -f 'Wall: %E User: %U Sys: %S | %C' -q -a -o ${FLATBUFFERS_COMPILATION_TIMINGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT FLATBUFFERS_BUILD_FLATC AND FLATBUFFERS_BUILD_TESTS)
|
||||||
|
message(WARNING
|
||||||
|
"Cannot build tests without building the compiler. Tests will be disabled.")
|
||||||
|
set(FLATBUFFERS_BUILD_TESTS OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)
|
||||||
|
# Override the default recursion depth limit.
|
||||||
|
add_definitions(-DFLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH})
|
||||||
|
message(STATUS "FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Auto-detect locale-narrow 'strtod_l' and 'strtoull_l' functions.
|
||||||
|
if(NOT DEFINED FLATBUFFERS_LOCALE_INDEPENDENT)
|
||||||
|
include(CheckCXXSymbolExists)
|
||||||
|
|
||||||
|
set(FLATBUFFERS_LOCALE_INDEPENDENT 0)
|
||||||
|
if(MSVC_LIKE)
|
||||||
|
check_cxx_symbol_exists(_strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)
|
||||||
|
check_cxx_symbol_exists(_strtoui64_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)
|
||||||
|
else()
|
||||||
|
check_cxx_symbol_exists(strtof_l stdlib.h FLATBUFFERS_HAS_STRTOF_L)
|
||||||
|
check_cxx_symbol_exists(strtoull_l stdlib.h FLATBUFFERS_HAS_STRTOULL_L)
|
||||||
|
endif()
|
||||||
|
if(FLATBUFFERS_HAS_STRTOF_L AND FLATBUFFERS_HAS_STRTOULL_L)
|
||||||
|
set(FLATBUFFERS_LOCALE_INDEPENDENT 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
add_definitions(-DFLATBUFFERS_LOCALE_INDEPENDENT=$<BOOL:${FLATBUFFERS_LOCALE_INDEPENDENT}>)
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
check_symbol_exists(realpath "stdlib.h" HAVE_REALPATH)
|
||||||
|
if(NOT HAVE_REALPATH)
|
||||||
|
add_definitions(-DFLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(FlatBuffers_Library_SRCS
|
||||||
|
include/flatbuffers/allocator.h
|
||||||
|
include/flatbuffers/array.h
|
||||||
|
include/flatbuffers/base.h
|
||||||
|
include/flatbuffers/buffer.h
|
||||||
|
include/flatbuffers/buffer_ref.h
|
||||||
|
include/flatbuffers/default_allocator.h
|
||||||
|
include/flatbuffers/detached_buffer.h
|
||||||
|
include/flatbuffers/code_generator.h
|
||||||
|
include/flatbuffers/file_manager.h
|
||||||
|
include/flatbuffers/flatbuffer_builder.h
|
||||||
|
include/flatbuffers/flatbuffers.h
|
||||||
|
include/flatbuffers/flexbuffers.h
|
||||||
|
include/flatbuffers/flex_flat_util.h
|
||||||
|
include/flatbuffers/hash.h
|
||||||
|
include/flatbuffers/idl.h
|
||||||
|
include/flatbuffers/minireflect.h
|
||||||
|
include/flatbuffers/reflection.h
|
||||||
|
include/flatbuffers/reflection_generated.h
|
||||||
|
include/flatbuffers/registry.h
|
||||||
|
include/flatbuffers/stl_emulation.h
|
||||||
|
include/flatbuffers/string.h
|
||||||
|
include/flatbuffers/struct.h
|
||||||
|
include/flatbuffers/table.h
|
||||||
|
include/flatbuffers/util.h
|
||||||
|
include/flatbuffers/vector.h
|
||||||
|
include/flatbuffers/vector_downward.h
|
||||||
|
include/flatbuffers/verifier.h
|
||||||
|
src/idl_parser.cpp
|
||||||
|
src/idl_gen_text.cpp
|
||||||
|
src/reflection.cpp
|
||||||
|
src/util.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Compiler_SRCS
|
||||||
|
${FlatBuffers_Library_SRCS}
|
||||||
|
src/idl_gen_binary.cpp
|
||||||
|
src/idl_gen_text.cpp
|
||||||
|
src/idl_gen_cpp.cpp
|
||||||
|
src/idl_gen_csharp.cpp
|
||||||
|
src/idl_gen_dart.cpp
|
||||||
|
src/idl_gen_kotlin.cpp
|
||||||
|
src/idl_gen_kotlin_kmp.cpp
|
||||||
|
src/idl_gen_go.cpp
|
||||||
|
src/idl_gen_java.cpp
|
||||||
|
src/idl_gen_ts.cpp
|
||||||
|
src/idl_gen_php.cpp
|
||||||
|
src/idl_gen_python.cpp
|
||||||
|
src/idl_gen_lobster.cpp
|
||||||
|
src/idl_gen_rust.cpp
|
||||||
|
src/idl_gen_fbs.cpp
|
||||||
|
src/idl_gen_grpc.cpp
|
||||||
|
src/idl_gen_json_schema.cpp
|
||||||
|
src/idl_gen_swift.cpp
|
||||||
|
src/file_name_saving_file_manager.cpp
|
||||||
|
src/file_binary_writer.cpp
|
||||||
|
src/file_writer.cpp
|
||||||
|
src/idl_namer.h
|
||||||
|
src/namer.h
|
||||||
|
src/flatc.cpp
|
||||||
|
src/flatc_main.cpp
|
||||||
|
src/bfbs_gen.h
|
||||||
|
src/bfbs_gen_lua.h
|
||||||
|
src/bfbs_gen_nim.h
|
||||||
|
src/bfbs_namer.h
|
||||||
|
include/flatbuffers/code_generators.h
|
||||||
|
src/binary_annotator.h
|
||||||
|
src/binary_annotator.cpp
|
||||||
|
src/annotated_binary_text_gen.h
|
||||||
|
src/annotated_binary_text_gen.cpp
|
||||||
|
src/bfbs_gen_lua.cpp
|
||||||
|
src/bfbs_gen_nim.cpp
|
||||||
|
src/code_generators.cpp
|
||||||
|
grpc/src/compiler/schema_interface.h
|
||||||
|
grpc/src/compiler/cpp_generator.h
|
||||||
|
grpc/src/compiler/cpp_generator.cc
|
||||||
|
grpc/src/compiler/go_generator.h
|
||||||
|
grpc/src/compiler/go_generator.cc
|
||||||
|
grpc/src/compiler/java_generator.h
|
||||||
|
grpc/src/compiler/java_generator.cc
|
||||||
|
grpc/src/compiler/python_generator.h
|
||||||
|
grpc/src/compiler/python_generator.cc
|
||||||
|
grpc/src/compiler/swift_generator.h
|
||||||
|
grpc/src/compiler/swift_generator.cc
|
||||||
|
grpc/src/compiler/ts_generator.h
|
||||||
|
grpc/src/compiler/ts_generator.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatHash_SRCS
|
||||||
|
include/flatbuffers/hash.h
|
||||||
|
src/flathash.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Tests_SRCS
|
||||||
|
${FlatBuffers_Library_SRCS}
|
||||||
|
src/idl_gen_fbs.cpp
|
||||||
|
tests/evolution_test.cpp
|
||||||
|
tests/flexbuffers_test.cpp
|
||||||
|
tests/fuzz_test.cpp
|
||||||
|
tests/json_test.cpp
|
||||||
|
tests/key_field_test.cpp
|
||||||
|
tests/monster_test.cpp
|
||||||
|
tests/optional_scalars_test.cpp
|
||||||
|
tests/parser_test.cpp
|
||||||
|
tests/proto_test.cpp
|
||||||
|
tests/reflection_test.cpp
|
||||||
|
tests/test.cpp
|
||||||
|
tests/test_assert.h
|
||||||
|
tests/test_assert.cpp
|
||||||
|
tests/test_builder.h
|
||||||
|
tests/test_builder.cpp
|
||||||
|
tests/util_test.cpp
|
||||||
|
tests/native_type_test_impl.h
|
||||||
|
tests/native_type_test_impl.cpp
|
||||||
|
tests/alignment_test.h
|
||||||
|
tests/alignment_test.cpp
|
||||||
|
tests/64bit/offset64_test.h
|
||||||
|
tests/64bit/offset64_test.cpp
|
||||||
|
include/flatbuffers/code_generators.h
|
||||||
|
src/code_generators.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Tests_CPP17_SRCS
|
||||||
|
${FlatBuffers_Library_SRCS}
|
||||||
|
tests/test_assert.h
|
||||||
|
tests/test_assert.cpp
|
||||||
|
tests/cpp17/test_cpp17.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Sample_Binary_SRCS
|
||||||
|
samples/sample_binary.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Sample_Text_SRCS
|
||||||
|
${FlatBuffers_Library_SRCS}
|
||||||
|
samples/sample_text.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_Sample_BFBS_SRCS
|
||||||
|
${FlatBuffers_Library_SRCS}
|
||||||
|
samples/sample_bfbs.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(FlatBuffers_GRPCTest_SRCS
|
||||||
|
include/flatbuffers/flatbuffers.h
|
||||||
|
include/flatbuffers/grpc.h
|
||||||
|
include/flatbuffers/util.h
|
||||||
|
src/util.cpp
|
||||||
|
tests/monster_test.grpc.fb.h
|
||||||
|
tests/test_assert.h
|
||||||
|
tests/test_builder.h
|
||||||
|
tests/monster_test.grpc.fb.cc
|
||||||
|
tests/test_assert.cpp
|
||||||
|
tests/test_builder.cpp
|
||||||
|
grpc/tests/grpctest.cpp
|
||||||
|
grpc/tests/message_builder_test.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO(dbaileychess): Figure out how this would now work. I posted a question on
|
||||||
|
# https://stackoverflow.com/questions/71772330/override-target-compile-options-via-cmake-command-line.
|
||||||
|
# Append FLATBUFFERS_CXX_FLAGS to CMAKE_CXX_FLAGS.
|
||||||
|
if(DEFINED FLATBUFFERS_CXX_FLAGS)
|
||||||
|
message(STATUS "extend CXX_FLAGS with ${FLATBUFFERS_CXX_FLAGS}")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLATBUFFERS_CXX_FLAGS}")
|
||||||
|
endif()
|
||||||
|
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
|
||||||
|
|
||||||
|
function(add_fsanitize_to_target _target _sanitizer)
|
||||||
|
if(WIN32)
|
||||||
|
target_compile_definitions(${_target} PRIVATE FLATBUFFERS_MEMORY_LEAK_TRACKING)
|
||||||
|
message(STATUS "Sanitizer MSVC::_CrtDumpMemoryLeaks added to ${_target}")
|
||||||
|
else()
|
||||||
|
# FLATBUFFERS_CODE_SANITIZE: boolean {ON,OFF,YES,NO} or string with list of sanitizer.
|
||||||
|
# List of sanitizer is string starts with '=': "=address,undefined,thread,memory".
|
||||||
|
if(IS_CLANG OR (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.9))
|
||||||
|
set(_sanitizer_flags "=address,undefined")
|
||||||
|
if(_sanitizer MATCHES "=.*")
|
||||||
|
# override default by user-defined sanitizer list
|
||||||
|
set(_sanitizer_flags ${_sanitizer})
|
||||||
|
endif()
|
||||||
|
target_compile_options(${_target} PRIVATE
|
||||||
|
-g -fsigned-char -fno-omit-frame-pointer
|
||||||
|
"-fsanitize${_sanitizer_flags}")
|
||||||
|
target_link_libraries(${_target} PRIVATE
|
||||||
|
"-fsanitize${_sanitizer_flags}")
|
||||||
|
set_target_properties(${_target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||||
|
message(STATUS "Sanitizer ${_sanitizer_flags} added to ${_target}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(add_pch_to_target _target _pch_header)
|
||||||
|
# the command is available since cmake 3.16
|
||||||
|
if(COMMAND target_precompile_headers)
|
||||||
|
target_precompile_headers(${_target} PRIVATE ${_pch_header})
|
||||||
|
if(NOT MSVC)
|
||||||
|
set_source_files_properties(src/util.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
include_directories(include)
|
||||||
|
include_directories(grpc)
|
||||||
|
|
||||||
|
# Creates an interface library that stores the configuration settings that each
|
||||||
|
# target links too. This is a compromise between setting configuration globally
|
||||||
|
# with add_compile_options() and the more targetted target_compile_options().
|
||||||
|
# This way each target in this file can share settings and override them if
|
||||||
|
# needed.
|
||||||
|
add_library(ProjectConfig INTERFACE)
|
||||||
|
target_compile_features(ProjectConfig
|
||||||
|
INTERFACE
|
||||||
|
cxx_std_${FLATBUFFERS_CPP_STD}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Force the standard to be met.
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
# We shouldn't rely on any compiler-extensions to make things work.
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
|
if(MSVC_LIKE)
|
||||||
|
target_compile_options(ProjectConfig
|
||||||
|
INTERFACE
|
||||||
|
/W4
|
||||||
|
$<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
|
||||||
|
/WX # Treat all compiler warnings as errors
|
||||||
|
>
|
||||||
|
/wd4512 # C4512: assignment operator could not be generated
|
||||||
|
/wd4316 # C4316: object allocated on the heap may not be aligned
|
||||||
|
/wd4456 # C4456: hides previous local declaration
|
||||||
|
$<$<CXX_COMPILER_ID:Clang>:
|
||||||
|
/D_CRT_SECURE_NO_WARNINGS
|
||||||
|
>
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
target_compile_options(ProjectConfig
|
||||||
|
INTERFACE
|
||||||
|
-Wall
|
||||||
|
$<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
|
||||||
|
-Werror # Treat all compiler warnings as errors
|
||||||
|
|
||||||
|
-fno-rtti # Disable runtime type information
|
||||||
|
|
||||||
|
$<$<CXX_COMPILER_ID:GNU>:
|
||||||
|
# False positive string overflow
|
||||||
|
# https://github.com/google/flatbuffers/issues/7366
|
||||||
|
-Wno-error=stringop-overflow
|
||||||
|
>
|
||||||
|
>
|
||||||
|
-pedantic
|
||||||
|
-Wextra
|
||||||
|
-Wno-unused-parameter
|
||||||
|
-Wold-style-cast
|
||||||
|
-fsigned-char
|
||||||
|
-Wnon-virtual-dtor
|
||||||
|
|
||||||
|
# This isn't working for some reason: $<$<CXX_COMPILER_ID:CLANG>:
|
||||||
|
$<$<BOOL:${IS_CLANG}>:
|
||||||
|
-Wnewline-eof
|
||||||
|
-Wno-unknown-warning-option
|
||||||
|
-Wmissing-declarations
|
||||||
|
-Wzero-as-null-pointer-constant
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,3.8>:
|
||||||
|
-Wimplicit-fallthrough
|
||||||
|
-Wextra-semi
|
||||||
|
$<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
|
||||||
|
-Werror=unused-private-field
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
|
||||||
|
$<$<CXX_COMPILER_ID:GNU>:
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.4>:
|
||||||
|
-Wunused-result
|
||||||
|
-Wunused-parameter
|
||||||
|
-Werror=unused-parameter
|
||||||
|
-Wmissing-declarations
|
||||||
|
>
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.7>:
|
||||||
|
-Wzero-as-null-pointer-constant
|
||||||
|
>
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,7.0>:
|
||||||
|
-faligned-new
|
||||||
|
$<$<BOOL:${FLATBUFFERS_STRICT_MODE}>:
|
||||||
|
-Werror=implicit-fallthrough=2
|
||||||
|
>
|
||||||
|
>
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,8.0>:
|
||||||
|
-Wextra-semi
|
||||||
|
>
|
||||||
|
>
|
||||||
|
|
||||||
|
$<$<BOOL:${FLATBUFFERS_CODE_COVERAGE}>:
|
||||||
|
-g
|
||||||
|
-fprofile-arcs
|
||||||
|
-ftest-coverage
|
||||||
|
>
|
||||||
|
)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_CODE_COVERAGE)
|
||||||
|
target_link_options(ProjectConfig
|
||||||
|
INTERFACE
|
||||||
|
-fprofile-arcs
|
||||||
|
-ftest-coverage
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_FLATLIB)
|
||||||
|
add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
|
||||||
|
|
||||||
|
# Attach header directory for when build via add_subdirectory().
|
||||||
|
target_include_directories(flatbuffers
|
||||||
|
INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
)
|
||||||
|
target_link_libraries(flatbuffers PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_ENABLE_PCH)
|
||||||
|
add_pch_to_target(flatbuffers include/flatbuffers/pch/pch.h)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_FLATC)
|
||||||
|
add_executable(flatc ${FlatBuffers_Compiler_SRCS})
|
||||||
|
if(FLATBUFFERS_ENABLE_PCH)
|
||||||
|
add_pch_to_target(flatc include/flatbuffers/pch/flatc_pch.h)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(flatc PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
target_compile_options(flatc
|
||||||
|
PRIVATE
|
||||||
|
$<$<AND:$<BOOL:${MSVC_LIKE}>,$<CONFIG:Release>>:
|
||||||
|
/MT
|
||||||
|
>
|
||||||
|
)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_CODE_SANITIZE AND NOT WIN32)
|
||||||
|
add_fsanitize_to_target(flatc ${FLATBUFFERS_CODE_SANITIZE})
|
||||||
|
endif()
|
||||||
|
if(NOT FLATBUFFERS_FLATC_EXECUTABLE)
|
||||||
|
set(FLATBUFFERS_FLATC_EXECUTABLE $<TARGET_FILE:flatc>)
|
||||||
|
endif()
|
||||||
|
if(FLATBUFFERS_STATIC_FLATC AND NOT MSVC)
|
||||||
|
target_link_libraries(flatc PRIVATE -static)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_FLATHASH)
|
||||||
|
add_executable(flathash ${FlatHash_SRCS})
|
||||||
|
target_link_libraries(flathash PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
add_library(flatbuffers_shared SHARED ${FlatBuffers_Library_SRCS})
|
||||||
|
target_link_libraries(flatbuffers_shared PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
# FlatBuffers use calendar-based versioning and do not provide any ABI
|
||||||
|
# stability guarantees. Therefore, always use the full version as SOVERSION
|
||||||
|
# in order to avoid breaking reverse dependencies on upgrades.
|
||||||
|
set(FlatBuffers_Library_SONAME_FULL "${PROJECT_VERSION}")
|
||||||
|
set_target_properties(flatbuffers_shared PROPERTIES
|
||||||
|
OUTPUT_NAME flatbuffers
|
||||||
|
SOVERSION "${FlatBuffers_Library_SONAME_FULL}"
|
||||||
|
VERSION "${FlatBuffers_Library_SONAME_FULL}")
|
||||||
|
if(FLATBUFFERS_ENABLE_PCH)
|
||||||
|
add_pch_to_target(flatbuffers_shared include/flatbuffers/pch/pch.h)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(compile_schema SRC_FBS OPT OUT_GEN_FILE)
|
||||||
|
get_filename_component(SRC_FBS_DIR ${SRC_FBS} PATH)
|
||||||
|
string(REGEX REPLACE "\\.fbs$" "_generated.h" GEN_HEADER ${SRC_FBS})
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${GEN_HEADER}
|
||||||
|
COMMAND "${FLATBUFFERS_FLATC_EXECUTABLE}"
|
||||||
|
${OPT}
|
||||||
|
-o "${SRC_FBS_DIR}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FBS}"
|
||||||
|
DEPENDS flatc ${SRC_FBS}
|
||||||
|
COMMENT "flatc generation: `${SRC_FBS}` -> `${GEN_HEADER}`"
|
||||||
|
)
|
||||||
|
set(${OUT_GEN_FILE} ${GEN_HEADER} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(compile_schema_for_test SRC_FBS OPT)
|
||||||
|
compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
|
||||||
|
target_sources(flattests PRIVATE ${GEN_FILE})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(compile_schema_for_samples SRC_FBS OPT)
|
||||||
|
compile_schema("${SRC_FBS}" "${OPT}" GEN_FILE)
|
||||||
|
target_sources(flatsample PRIVATE ${GEN_FILE})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_TESTS)
|
||||||
|
add_executable(flattests ${FlatBuffers_Tests_SRCS})
|
||||||
|
target_link_libraries(flattests PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
target_include_directories(flattests PUBLIC
|
||||||
|
# Ideally everything is fully qualified from the root directories
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
# TODO(derekbailey): update includes to fully qualify src/ and tests/
|
||||||
|
src
|
||||||
|
tests
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/tests
|
||||||
|
)
|
||||||
|
|
||||||
|
# Have tests load data from the source directory, not the build directory.
|
||||||
|
add_definitions(-DFLATBUFFERS_TEST_PATH_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/)
|
||||||
|
|
||||||
|
# The flattest target needs some generated files
|
||||||
|
SET(FLATC_OPT --cpp --gen-mutable --gen-object-api --reflect-names)
|
||||||
|
SET(FLATC_OPT_COMP ${FLATC_OPT};--gen-compare)
|
||||||
|
SET(FLATC_OPT_SCOPED_ENUMS ${FLATC_OPT_COMP};--scoped-enums)
|
||||||
|
|
||||||
|
compile_schema_for_test(tests/alignment_test.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/arrays_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
|
||||||
|
compile_schema_for_test(tests/native_inline_table_test.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/native_type_test.fbs "${FLATC_OPT}")
|
||||||
|
compile_schema_for_test(tests/key_field/key_field_sample.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/64bit/test_64bit.fbs "${FLATC_OPT_COMP};--bfbs-gen-embed")
|
||||||
|
compile_schema_for_test(tests/64bit/evolution/v1.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/64bit/evolution/v2.fbs "${FLATC_OPT_COMP}")
|
||||||
|
compile_schema_for_test(tests/union_underlying_type_test.fbs "${FLATC_OPT_SCOPED_ENUMS}")
|
||||||
|
|
||||||
|
if(FLATBUFFERS_CODE_SANITIZE)
|
||||||
|
add_fsanitize_to_target(flattests ${FLATBUFFERS_CODE_SANITIZE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/samples)
|
||||||
|
|
||||||
|
add_executable(flatsamplebinary ${FlatBuffers_Sample_Binary_SRCS})
|
||||||
|
add_executable(flatsampletext ${FlatBuffers_Sample_Text_SRCS})
|
||||||
|
add_executable(flatsamplebfbs ${FlatBuffers_Sample_BFBS_SRCS})
|
||||||
|
|
||||||
|
# Add a library so there is a single target that the generated samples can
|
||||||
|
# link too.
|
||||||
|
if(MSVC OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20.0")
|
||||||
|
add_library(flatsample INTERFACE)
|
||||||
|
else()
|
||||||
|
add_library(flatsample STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Since flatsample has no sources, we have to explicitly set the linker lang.
|
||||||
|
set_target_properties(flatsample PROPERTIES LINKER_LANGUAGE CXX)
|
||||||
|
|
||||||
|
compile_schema_for_samples(samples/monster.fbs "${FLATC_OPT_COMP}")
|
||||||
|
|
||||||
|
target_link_libraries(flatsamplebinary PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
||||||
|
target_link_libraries(flatsampletext PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
||||||
|
target_link_libraries(flatsamplebfbs PRIVATE $<BUILD_INTERFACE:ProjectConfig> flatsample)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_CPP17)
|
||||||
|
add_executable(flattests_cpp17 ${FlatBuffers_Tests_CPP17_SRCS})
|
||||||
|
target_link_libraries(flattests_cpp17 PRIVATE $<BUILD_INTERFACE:ProjectConfig>)
|
||||||
|
target_include_directories(flattests_cpp17 PUBLIC src tests)
|
||||||
|
target_compile_features(flattests_cpp17 PRIVATE cxx_std_17) # requires cmake 3.8
|
||||||
|
|
||||||
|
if(FLATBUFFERS_CODE_SANITIZE)
|
||||||
|
add_fsanitize_to_target(flattests_cpp17 ${FLATBUFFERS_CODE_SANITIZE})
|
||||||
|
endif()
|
||||||
|
endif(FLATBUFFERS_BUILD_CPP17)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_GRPCTEST)
|
||||||
|
if(NOT GRPC_INSTALL_PATH)
|
||||||
|
message(SEND_ERROR "GRPC_INSTALL_PATH variable is not defined. See grpc/README.md")
|
||||||
|
endif()
|
||||||
|
if(NOT PROTOBUF_DOWNLOAD_PATH)
|
||||||
|
message(SEND_ERROR "PROTOBUF_DOWNLOAD_PATH variable is not defined. See grpc/README.md")
|
||||||
|
endif()
|
||||||
|
INCLUDE_DIRECTORIES(${GRPC_INSTALL_PATH}/include)
|
||||||
|
INCLUDE_DIRECTORIES(${PROTOBUF_DOWNLOAD_PATH}/src)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH ${GRPC_INSTALL_PATH})
|
||||||
|
find_package(absl CONFIG REQUIRED)
|
||||||
|
find_package(protobuf CONFIG REQUIRED)
|
||||||
|
find_package(gRPC CONFIG REQUIRED)
|
||||||
|
add_executable(grpctest ${FlatBuffers_GRPCTest_SRCS})
|
||||||
|
target_link_libraries(grpctest
|
||||||
|
PRIVATE
|
||||||
|
$<BUILD_INTERFACE:ProjectConfig>
|
||||||
|
gRPC::grpc++_unsecure
|
||||||
|
gRPC::gpr
|
||||||
|
pthread
|
||||||
|
dl
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_INSTALL)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
install(DIRECTORY include/flatbuffers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||||
|
|
||||||
|
set(FB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/flatbuffers")
|
||||||
|
|
||||||
|
configure_file(CMake/flatbuffers-config-version.cmake.in flatbuffers-config-version.cmake @ONLY)
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
"CMake/flatbuffers-config.cmake"
|
||||||
|
"CMake/BuildFlatBuffers.cmake"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-config-version.cmake"
|
||||||
|
DESTINATION ${FB_CMAKE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_FLATLIB)
|
||||||
|
install(
|
||||||
|
TARGETS flatbuffers EXPORT FlatBuffersTargets
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(EXPORT FlatBuffersTargets
|
||||||
|
FILE FlatBuffersTargets.cmake
|
||||||
|
NAMESPACE flatbuffers::
|
||||||
|
DESTINATION ${FB_CMAKE_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_FLATC)
|
||||||
|
install(
|
||||||
|
TARGETS flatc EXPORT FlatcTargets
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
EXPORT FlatcTargets
|
||||||
|
FILE FlatcTargets.cmake
|
||||||
|
NAMESPACE flatbuffers::
|
||||||
|
DESTINATION ${FB_CMAKE_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
install(
|
||||||
|
TARGETS flatbuffers_shared EXPORT FlatBuffersSharedTargets
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
EXPORT FlatBuffersSharedTargets
|
||||||
|
FILE FlatBuffersSharedTargets.cmake
|
||||||
|
NAMESPACE flatbuffers::
|
||||||
|
DESTINATION ${FB_CMAKE_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_SHAREDLIB OR FLATBUFFERS_BUILD_FLATLIB)
|
||||||
|
configure_file(CMake/flatbuffers.pc.in flatbuffers.pc @ONLY)
|
||||||
|
install(
|
||||||
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/flatbuffers.pc"
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(FLATBUFFERS_BUILD_TESTS)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
add_test(NAME flattests COMMAND flattests)
|
||||||
|
if(FLATBUFFERS_BUILD_CPP17)
|
||||||
|
add_test(NAME flattests_cpp17 COMMAND flattests_cpp17)
|
||||||
|
endif()
|
||||||
|
if(FLATBUFFERS_BUILD_GRPCTEST)
|
||||||
|
add_test(NAME grpctest COMMAND grpctest)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CMake/BuildFlatBuffers.cmake)
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
# Use of CPack only supported on Linux systems.
|
||||||
|
if(FLATBUFFERS_PACKAGE_DEBIAN)
|
||||||
|
include(CMake/PackageDebian.cmake)
|
||||||
|
include(CPack)
|
||||||
|
endif()
|
||||||
|
if (FLATBUFFERS_PACKAGE_REDHAT)
|
||||||
|
include(CMake/PackageRedhat.cmake)
|
||||||
|
include(CPack)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include for running Google Benchmarks.
|
||||||
|
if(FLATBUFFERS_BUILD_BENCHMARKS)
|
||||||
|
add_subdirectory(benchmarks)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Add FlatBuffers::FlatBuffers interface, needed for FetchContent_Declare
|
||||||
|
add_library(FlatBuffers INTERFACE)
|
||||||
|
add_library(FlatBuffers::FlatBuffers ALIAS FlatBuffers)
|
||||||
|
target_include_directories(
|
||||||
|
FlatBuffers
|
||||||
|
INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/include>)
|
||||||
42
third_party/flatbuffers/CONTRIBUTING.md
vendored
Normal file
42
third_party/flatbuffers/CONTRIBUTING.md
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
Contributing {#contributing}
|
||||||
|
============
|
||||||
|
|
||||||
|
Want to contribute? Great! First, read this page (including the small print at
|
||||||
|
the end).
|
||||||
|
|
||||||
|
# Before you contribute
|
||||||
|
Before we can use your code, you must sign the
|
||||||
|
[Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual?csw=1)
|
||||||
|
(CLA), which you can do online. The CLA is necessary mainly because you own the
|
||||||
|
copyright to your changes, even after your contribution becomes part of our
|
||||||
|
codebase, so we need your permission to use and distribute your code. We also
|
||||||
|
need to be sure of various other things—for instance that you'll tell us if you
|
||||||
|
know that your code infringes on other people's patents. You don't have to sign
|
||||||
|
the CLA until after you've submitted your code for review and a member has
|
||||||
|
approved it, but you must do it before we can put your code into our codebase.
|
||||||
|
Before you start working on a larger contribution, you should get in touch with
|
||||||
|
us first through the issue tracker with your idea so that we can help out and
|
||||||
|
possibly guide you. Coordinating up front makes it much easier to avoid
|
||||||
|
frustration later on.
|
||||||
|
|
||||||
|
# Code reviews
|
||||||
|
All submissions, including submissions by project members, require review. We
|
||||||
|
use Github pull requests for this purpose.
|
||||||
|
|
||||||
|
Some tips for good pull requests:
|
||||||
|
* Use our code
|
||||||
|
[style guide](https://google.github.io/styleguide/cppguide.html).
|
||||||
|
When in doubt, try to stay true to the existing code of the project.
|
||||||
|
* Write a descriptive commit message. What problem are you solving and what
|
||||||
|
are the consequences? Where and what did you test? Some good tips:
|
||||||
|
[here](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message)
|
||||||
|
and [here](https://www.kernel.org/doc/Documentation/SubmittingPatches).
|
||||||
|
* If your PR consists of multiple commits which are successive improvements /
|
||||||
|
fixes to your first commit, consider squashing them into a single commit
|
||||||
|
(`git rebase -i`) such that your PR is a single commit on top of the current
|
||||||
|
HEAD. This make reviewing the code so much easier, and our history more
|
||||||
|
readable.
|
||||||
|
|
||||||
|
# The small print
|
||||||
|
Contributions made by corporations are covered by a different agreement than
|
||||||
|
the one above, the Software Grant and Corporate Contributor License Agreement.
|
||||||
21
third_party/flatbuffers/FlatBuffers.podspec
vendored
Normal file
21
third_party/flatbuffers/FlatBuffers.podspec
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
Pod::Spec.new do |s|
|
||||||
|
s.name = 'FlatBuffers'
|
||||||
|
s.version = '24.3.25'
|
||||||
|
s.summary = 'FlatBuffers: Memory Efficient Serialization Library'
|
||||||
|
|
||||||
|
s.description = "FlatBuffers is a cross platform serialization library architected for
|
||||||
|
maximum memory efficiency. It allows you to directly access serialized
|
||||||
|
data without parsing/unpacking it first, while still having great
|
||||||
|
forwards/backwards compatibility."
|
||||||
|
|
||||||
|
s.homepage = 'https://github.com/google/flatbuffers'
|
||||||
|
s.license = { :type => 'Apache2.0', :file => 'LICENSE' }
|
||||||
|
s.author = { 'mustii' => 'mustii@mmk.one' }
|
||||||
|
s.source = { :git => 'https://github.com/google/flatbuffers.git', :tag => s.version.to_s, :submodules => true }
|
||||||
|
|
||||||
|
s.ios.deployment_target = '11.0'
|
||||||
|
s.osx.deployment_target = '10.14'
|
||||||
|
|
||||||
|
s.swift_version = '5.0'
|
||||||
|
s.source_files = 'swift/Sources/Flatbuffers/*.swift'
|
||||||
|
end
|
||||||
22
third_party/flatbuffers/Formatters.md
vendored
Normal file
22
third_party/flatbuffers/Formatters.md
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Format Guidelines
|
||||||
|
|
||||||
|
If you are interesting in contributing to the flatbuffers project, please take a second to read this document. Each language has it's own set of rules, that are defined in their respective formatter/linter documents.
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
|
||||||
|
- Run the linter on the language you are working on before making a Pull Request.
|
||||||
|
- DONT format/lint the generated code.
|
||||||
|
|
||||||
|
# Languages
|
||||||
|
|
||||||
|
## C++
|
||||||
|
|
||||||
|
C++ uses `clang-format` as it's formatter. Run the following script `sh scripts/clang-format-git.sh`, and it should style the C++ code according to [google style guide](https://google.github.io/styleguide/cppguide.html).
|
||||||
|
|
||||||
|
## Swift
|
||||||
|
|
||||||
|
Swift uses swiftformat as it's formatter. Take a look at [how to install here](https://github.com/nicklockwood/SwiftFormat/blob/master/README.md#how-do-i-install-it). Run the following command `swiftformat --config swift.swiftformat .` in the root directory of the project
|
||||||
|
|
||||||
|
## Typescript
|
||||||
|
|
||||||
|
Typescript uses eslint as it's linter. Take a look at [how to install here](https://eslint.org/docs/user-guide/getting-started). Run the following command `eslint ts/** --ext .ts` in the root directory of the project
|
||||||
202
third_party/flatbuffers/LICENSE
vendored
Normal file
202
third_party/flatbuffers/LICENSE
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
36
third_party/flatbuffers/Package.swift
vendored
Normal file
36
third_party/flatbuffers/Package.swift
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// swift-tools-version:5.6
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
platforms: [
|
||||||
|
.iOS(.v11),
|
||||||
|
.macOS(.v10_14),
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
targets: ["FlatBuffers"]),
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
dependencies: [],
|
||||||
|
path: "swift/Sources"),
|
||||||
|
])
|
||||||
37
third_party/flatbuffers/Package@swift-5.5.swift
vendored
Normal file
37
third_party/flatbuffers/Package@swift-5.5.swift
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// swift-tools-version:5.5
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
platforms: [
|
||||||
|
.iOS(.v11),
|
||||||
|
.macOS(.v10_14),
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
targets: ["FlatBuffers"]),
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "FlatBuffers",
|
||||||
|
dependencies: [],
|
||||||
|
path: "swift/Sources"),
|
||||||
|
])
|
||||||
|
|
||||||
118
third_party/flatbuffers/README.md
vendored
Normal file
118
third_party/flatbuffers/README.md
vendored
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
 FlatBuffers
|
||||||
|
===========
|
||||||
|
|
||||||
|

|
||||||
|
[](https://buildkite.com/bazel/flatbuffers)
|
||||||
|
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:flatbuffers)
|
||||||
|
[](https://api.securityscorecards.dev/projects/github.com/google/flatbuffers)
|
||||||
|
[](https://gitter.im/google/flatbuffers?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
[](https:///discord.gg/6qgKs3R)
|
||||||
|
[](https://twitter.com/wvo)
|
||||||
|
[](https://twitter.com/dbaileychess)
|
||||||
|
|
||||||
|
|
||||||
|
**FlatBuffers** is a cross platform serialization library architected for
|
||||||
|
maximum memory efficiency. It allows you to directly access serialized data without parsing/unpacking it first, while still having great forwards/backwards compatibility.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. Build the compiler for flatbuffers (`flatc`)
|
||||||
|
|
||||||
|
Use `cmake` to create the build files for your platform and then perform the compliation (Linux example).
|
||||||
|
|
||||||
|
```
|
||||||
|
cmake -G "Unix Makefiles"
|
||||||
|
make -j
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Define your flatbuffer schema (`.fbs`)
|
||||||
|
|
||||||
|
Write the [schema](https://flatbuffers.dev/flatbuffers_guide_writing_schema.html) to define the data you want to serialize. See [monster.fbs](https://github.com/google/flatbuffers/blob/master/samples/monster.fbs) for an example.
|
||||||
|
|
||||||
|
3. Generate code for your language(s)
|
||||||
|
|
||||||
|
Use the `flatc` compiler to take your schema and generate language-specific code:
|
||||||
|
|
||||||
|
```
|
||||||
|
./flatc --cpp --rust monster.fbs
|
||||||
|
```
|
||||||
|
|
||||||
|
Which generates `monster_generated.h` and `monster_generated.rs` files.
|
||||||
|
|
||||||
|
4. Serialize data
|
||||||
|
|
||||||
|
Use the generated code, as well as the `FlatBufferBuilder` to construct your serialized buffer. ([`C++` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp#L24-L56))
|
||||||
|
|
||||||
|
5. Transmit/store/save Buffer
|
||||||
|
|
||||||
|
Use your serialized buffer however you want. Send it to someone, save it for later, etc...
|
||||||
|
|
||||||
|
6. Read the data
|
||||||
|
|
||||||
|
Use the generated accessors to read the data from the serialized buffer.
|
||||||
|
|
||||||
|
It doesn't need to be the same language/schema version, FlatBuffers ensures the data is readable across languages and schema versions. See the [`Rust` example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106) reading the data written by `C++`.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
**Go to our [landing page][] to browse our documentation.**
|
||||||
|
|
||||||
|
## Supported operating systems
|
||||||
|
- Windows
|
||||||
|
- macOS
|
||||||
|
- Linux
|
||||||
|
- Android
|
||||||
|
- And any others with a recent C++ compiler (C++ 11 and newer)
|
||||||
|
|
||||||
|
## Supported programming languages
|
||||||
|
|
||||||
|
Code generation and runtime libraries for many popular languages.
|
||||||
|
|
||||||
|
1. C
|
||||||
|
1. C++ - [snapcraft.io](https://snapcraft.io/flatbuffers)
|
||||||
|
1. C# - [nuget.org](https://www.nuget.org/packages/Google.FlatBuffers)
|
||||||
|
1. Dart - [pub.dev](https://pub.dev/packages/flat_buffers)
|
||||||
|
1. Go - [go.dev](https://pkg.go.dev/github.com/google/flatbuffers)
|
||||||
|
1. Java - [Maven](https://search.maven.org/artifact/com.google.flatbuffers/flatbuffers-java)
|
||||||
|
1. JavaScript - [NPM](https://www.npmjs.com/package/flatbuffers)
|
||||||
|
1. Kotlin
|
||||||
|
1. Lobster
|
||||||
|
1. Lua
|
||||||
|
1. PHP
|
||||||
|
1. Python - [PyPI](https://pypi.org/project/flatbuffers/)
|
||||||
|
1. Rust - [crates.io](https://crates.io/crates/flatbuffers)
|
||||||
|
1. Swift - [swiftpackageindex](https://swiftpackageindex.com/google/flatbuffers)
|
||||||
|
1. TypeScript - [NPM](https://www.npmjs.com/package/flatbuffers)
|
||||||
|
1. Nim
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
FlatBuffers does not follow traditional SemVer versioning (see [rationale](https://github.com/google/flatbuffers/wiki/Versioning)) but rather uses a format of the date of the release.
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
* [FlatBuffers Issues Tracker][] to submit an issue.
|
||||||
|
* [stackoverflow.com][] with [`flatbuffers` tag][] for any questions regarding FlatBuffers.
|
||||||
|
|
||||||
|
*To contribute to this project,* see [CONTRIBUTING][].
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
* [Discord Server](https:///discord.gg/6qgKs3R)
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
Please see our [Security Policy](SECURITY.md) for reporting vulnerabilities.
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
*Flatbuffers* is licensed under the Apache License, Version 2.0. See [LICENSE][] for the full license text.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
[CONTRIBUTING]: http://github.com/google/flatbuffers/blob/master/CONTRIBUTING.md
|
||||||
|
[`flatbuffers` tag]: https://stackoverflow.com/questions/tagged/flatbuffers
|
||||||
|
[FlatBuffers Google Group]: https://groups.google.com/forum/#!forum/flatbuffers
|
||||||
|
[FlatBuffers Issues Tracker]: http://github.com/google/flatbuffers/issues
|
||||||
|
[stackoverflow.com]: http://stackoverflow.com/search?q=flatbuffers
|
||||||
|
[landing page]: https://google.github.io/flatbuffers
|
||||||
|
[LICENSE]: https://github.com/google/flatbuffers/blob/master/LICENSE
|
||||||
11
third_party/flatbuffers/SECURITY.md
vendored
Normal file
11
third_party/flatbuffers/SECURITY.md
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
To report a security issue, please use http://g.co/vulnz. We use
|
||||||
|
http://g.co/vulnz for our intake, and do coordination and disclosure here on
|
||||||
|
GitHub (including using GitHub Security Advisory). The Google Security Team will
|
||||||
|
respond within 5 working days of your report on g.co/vulnz.
|
||||||
|
|
||||||
|
Select the `I want to report a technical security or an abuse risk related bug
|
||||||
|
in a Google product (SQLi, XSS, etc.)` option and complete the form.
|
||||||
169
third_party/flatbuffers/WORKSPACE
vendored
Normal file
169
third_party/flatbuffers/WORKSPACE
vendored
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
workspace(name = "com_github_google_flatbuffers")
|
||||||
|
|
||||||
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "platforms",
|
||||||
|
sha256 = "3a561c99e7bdbe9173aa653fd579fe849f1d8d67395780ab4770b1f381431d51",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "build_bazel_rules_apple",
|
||||||
|
sha256 = "34c41bfb59cdaea29ac2df5a2fa79e5add609c71bb303b2ebb10985f93fa20e7",
|
||||||
|
url = "https://github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_apple//apple:repositories.bzl",
|
||||||
|
"apple_rules_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
apple_rules_dependencies()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "build_bazel_rules_swift",
|
||||||
|
sha256 = "a2fd565e527f83fb3f9eb07eb9737240e668c9242d3bc318712efa54a7deda97",
|
||||||
|
url = "https://github.com/bazelbuild/rules_swift/releases/download/0.27.0/rules_swift.0.27.0.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_swift//swift:repositories.bzl",
|
||||||
|
"swift_rules_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
swift_rules_dependencies()
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@build_bazel_rules_swift//swift:extras.bzl",
|
||||||
|
"swift_rules_extra_dependencies",
|
||||||
|
)
|
||||||
|
|
||||||
|
swift_rules_extra_dependencies()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "io_bazel_rules_go",
|
||||||
|
sha256 = "278b7ff5a826f3dc10f04feaf0b70d48b68748ccd512d7f98bf442077f043fe3",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip",
|
||||||
|
"https://github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies")
|
||||||
|
|
||||||
|
go_rules_dependencies()
|
||||||
|
|
||||||
|
##### Protobuf
|
||||||
|
_PROTOBUF_VERSION = "3.15.2"
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_google_protobuf",
|
||||||
|
strip_prefix = "protobuf-" + _PROTOBUF_VERSION,
|
||||||
|
urls = [
|
||||||
|
"https://github.com/protocolbuffers/protobuf/archive/v" + _PROTOBUF_VERSION + ".tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
##### GRPC
|
||||||
|
_GRPC_VERSION = "1.49.0" # https://github.com/grpc/grpc/releases/tag/v1.48.0
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_github_grpc_grpc",
|
||||||
|
patch_args = ["-p1"],
|
||||||
|
patches = ["//grpc:build_grpc_with_cxx14.patch"],
|
||||||
|
sha256 = "15715e1847cc9e42014f02c727dbcb48e39dbdb90f79ad3d66fe4361709ff935",
|
||||||
|
strip_prefix = "grpc-" + _GRPC_VERSION,
|
||||||
|
urls = ["https://github.com/grpc/grpc/archive/refs/tags/v" + _GRPC_VERSION + ".tar.gz"],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
|
||||||
|
|
||||||
|
grpc_deps()
|
||||||
|
|
||||||
|
load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
|
||||||
|
|
||||||
|
grpc_extra_deps()
|
||||||
|
|
||||||
|
# rules_go from https://github.com/bazelbuild/rules_go/releases/tag/v0.34.0
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_js",
|
||||||
|
sha256 = "76a04ef2120ee00231d85d1ff012ede23963733339ad8db81f590791a031f643",
|
||||||
|
strip_prefix = "rules_js-1.34.1",
|
||||||
|
url = "https://github.com/aspect-build/rules_js/releases/download/v1.34.1/rules_js-v1.34.1.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies")
|
||||||
|
|
||||||
|
rules_js_dependencies()
|
||||||
|
|
||||||
|
load("@aspect_rules_js//npm:npm_import.bzl", "npm_translate_lock", "pnpm_repository")
|
||||||
|
|
||||||
|
pnpm_repository(name = "pnpm")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_ts",
|
||||||
|
sha256 = "4c3f34fff9f96ffc9c26635d8235a32a23a6797324486c7d23c1dfa477e8b451",
|
||||||
|
strip_prefix = "rules_ts-1.4.5",
|
||||||
|
url = "https://github.com/aspect-build/rules_ts/releases/download/v1.4.5/rules_ts-v1.4.5.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@aspect_rules_ts//ts:repositories.bzl", "rules_ts_dependencies")
|
||||||
|
|
||||||
|
rules_ts_dependencies(
|
||||||
|
# Since rules_ts doesn't always have the newest integrity hashes, we
|
||||||
|
# compute it manually here.
|
||||||
|
# $ curl --silent https://registry.npmjs.org/typescript/5.3.3 | jq ._integrity
|
||||||
|
ts_integrity = "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
|
||||||
|
ts_version_from = "//:package.json",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@rules_nodejs//nodejs:repositories.bzl", "DEFAULT_NODE_VERSION", "nodejs_register_toolchains")
|
||||||
|
|
||||||
|
nodejs_register_toolchains(
|
||||||
|
name = "nodejs",
|
||||||
|
node_version = DEFAULT_NODE_VERSION,
|
||||||
|
)
|
||||||
|
|
||||||
|
npm_translate_lock(
|
||||||
|
name = "npm",
|
||||||
|
npmrc = "//:.npmrc",
|
||||||
|
pnpm_lock = "//:pnpm-lock.yaml",
|
||||||
|
# Set this to True when the lock file needs to be updated, commit the
|
||||||
|
# changes, then set to False again.
|
||||||
|
update_pnpm_lock = False,
|
||||||
|
verify_node_modules_ignored = "//:.bazelignore",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@npm//:repositories.bzl", "npm_repositories")
|
||||||
|
|
||||||
|
npm_repositories()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "aspect_rules_esbuild",
|
||||||
|
sha256 = "098e38e5ee868c14a6484ba263b79e57d48afacfc361ba30137c757a9c4716d6",
|
||||||
|
strip_prefix = "rules_esbuild-0.15.0",
|
||||||
|
url = "https://github.com/aspect-build/rules_esbuild/releases/download/v0.15.0/rules_esbuild-v0.15.0.tar.gz",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Register a toolchain containing esbuild npm package and native bindings
|
||||||
|
load("@aspect_rules_esbuild//esbuild:repositories.bzl", "LATEST_ESBUILD_VERSION", "esbuild_register_toolchains")
|
||||||
|
|
||||||
|
esbuild_register_toolchains(
|
||||||
|
name = "esbuild",
|
||||||
|
esbuild_version = LATEST_ESBUILD_VERSION,
|
||||||
|
)
|
||||||
|
|
||||||
|
http_file(
|
||||||
|
name = "bazel_linux_x86_64",
|
||||||
|
downloaded_file_path = "bazel",
|
||||||
|
executable = True,
|
||||||
|
sha256 = "e78fc3394deae5408d6f49a15c7b1e615901969ecf6e50d55ef899996b0b8458",
|
||||||
|
urls = [
|
||||||
|
"https://github.com/bazelbuild/bazel/releases/download/6.3.2/bazel-6.3.2-linux-x86_64",
|
||||||
|
],
|
||||||
|
)
|
||||||
284
third_party/flatbuffers/build_defs.bzl
vendored
Normal file
284
third_party/flatbuffers/build_defs.bzl
vendored
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
# Description:
|
||||||
|
# BUILD rules for generating flatbuffer files in various languages.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Rules for building C++ flatbuffers with Bazel.
|
||||||
|
"""
|
||||||
|
|
||||||
|
load("@rules_cc//cc:defs.bzl", "cc_library")
|
||||||
|
|
||||||
|
TRUE_FLATC_PATH = "@com_github_google_flatbuffers//:flatc"
|
||||||
|
|
||||||
|
DEFAULT_INCLUDE_PATHS = [
|
||||||
|
"./",
|
||||||
|
"$(GENDIR)",
|
||||||
|
"$(BINDIR)",
|
||||||
|
"$(execpath @com_github_google_flatbuffers//:flatc).runfiles/com_github_google_flatbuffers",
|
||||||
|
]
|
||||||
|
|
||||||
|
def default_include_paths(flatc_path):
|
||||||
|
return [
|
||||||
|
"./",
|
||||||
|
"$(GENDIR)",
|
||||||
|
"$(BINDIR)",
|
||||||
|
"$(execpath %s).runfiles/com_github_google_flatbuffers" % (flatc_path),
|
||||||
|
]
|
||||||
|
|
||||||
|
DEFAULT_FLATC_ARGS = [
|
||||||
|
"--gen-object-api",
|
||||||
|
"--gen-compare",
|
||||||
|
"--no-includes",
|
||||||
|
"--gen-mutable",
|
||||||
|
"--reflect-names",
|
||||||
|
"--cpp-ptr-type flatbuffers::unique_ptr",
|
||||||
|
]
|
||||||
|
|
||||||
|
def flatbuffer_library_public(
|
||||||
|
name,
|
||||||
|
srcs,
|
||||||
|
outs,
|
||||||
|
language_flag,
|
||||||
|
out_prefix = "",
|
||||||
|
includes = [],
|
||||||
|
include_paths = None,
|
||||||
|
flatc_args = DEFAULT_FLATC_ARGS,
|
||||||
|
reflection_name = "",
|
||||||
|
reflection_visibility = None,
|
||||||
|
compatible_with = None,
|
||||||
|
restricted_to = None,
|
||||||
|
target_compatible_with = None,
|
||||||
|
flatc_path = "@com_github_google_flatbuffers//:flatc",
|
||||||
|
output_to_bindir = False,
|
||||||
|
tools = None,
|
||||||
|
extra_env = None,
|
||||||
|
**kwargs):
|
||||||
|
"""Generates code files for reading/writing the given flatbuffers in the requested language using the public compiler.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: Rule name.
|
||||||
|
srcs: Source .fbs files. Sent in order to the compiler.
|
||||||
|
outs: Output files from flatc.
|
||||||
|
language_flag: Target language flag. One of [-c, -j, -js].
|
||||||
|
out_prefix: Prepend this path to the front of all generated files except on
|
||||||
|
single source targets. Usually is a directory name.
|
||||||
|
includes: Optional, list of filegroups of schemas that the srcs depend on.
|
||||||
|
include_paths: Optional, list of paths the includes files can be found in.
|
||||||
|
flatc_args: Optional, list of additional arguments to pass to flatc.
|
||||||
|
reflection_name: Optional, if set this will generate the flatbuffer
|
||||||
|
reflection binaries for the schemas.
|
||||||
|
reflection_visibility: The visibility of the generated reflection Fileset.
|
||||||
|
output_to_bindir: Passed to genrule for output to bin directory.
|
||||||
|
compatible_with: Optional, The list of environments this rule can be
|
||||||
|
built for, in addition to default-supported environments.
|
||||||
|
restricted_to: Optional, The list of environments this rule can be built
|
||||||
|
for, instead of default-supported environments.
|
||||||
|
target_compatible_with: Optional, The list of target platform constraints
|
||||||
|
to use.
|
||||||
|
flatc_path: Bazel target corresponding to the flatc compiler to use.
|
||||||
|
output_to_bindir: Passed to genrule for output to bin directory.
|
||||||
|
tools: Optional, passed to genrule for list of tools to make available
|
||||||
|
during the action.
|
||||||
|
extra_env: Optional, must be a string of "VAR1=VAL1 VAR2=VAL2". These get
|
||||||
|
set as environment variables that "flatc_path" sees.
|
||||||
|
**kwargs: Passed to the underlying genrule.
|
||||||
|
|
||||||
|
|
||||||
|
This rule creates a filegroup(name) with all generated source files, and
|
||||||
|
optionally a Fileset([reflection_name]) with all generated reflection
|
||||||
|
binaries.
|
||||||
|
"""
|
||||||
|
reflection_include_paths = include_paths
|
||||||
|
if include_paths == None:
|
||||||
|
include_paths = default_include_paths(flatc_path)
|
||||||
|
include_paths_cmd = ["-I %s" % (s) for s in include_paths]
|
||||||
|
|
||||||
|
extra_env = extra_env or ""
|
||||||
|
|
||||||
|
# '$(@D)' when given a single source target will give the appropriate
|
||||||
|
# directory. Appending 'out_prefix' is only necessary when given a build
|
||||||
|
# target with multiple sources.
|
||||||
|
output_directory = (
|
||||||
|
("-o $(@D)/%s" % (out_prefix)) if len(srcs) > 1 else ("-o $(@D)")
|
||||||
|
)
|
||||||
|
genrule_cmd = " ".join([
|
||||||
|
"SRCS=($(SRCS));",
|
||||||
|
"for f in $${SRCS[@]:0:%s}; do" % len(srcs),
|
||||||
|
"OUTPUT_FILE=\"$(OUTS)\" %s $(location %s)" % (extra_env, flatc_path),
|
||||||
|
" ".join(include_paths_cmd),
|
||||||
|
" ".join(flatc_args),
|
||||||
|
language_flag,
|
||||||
|
output_directory,
|
||||||
|
"$$f;",
|
||||||
|
"done",
|
||||||
|
])
|
||||||
|
native.genrule(
|
||||||
|
name = name,
|
||||||
|
srcs = srcs + includes,
|
||||||
|
outs = outs,
|
||||||
|
output_to_bindir = output_to_bindir,
|
||||||
|
tools = (tools or []) + [flatc_path],
|
||||||
|
cmd = genrule_cmd,
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
target_compatible_with = target_compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
message = "Generating flatbuffer files for %s:" % (name),
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
if reflection_name:
|
||||||
|
if reflection_include_paths == None:
|
||||||
|
reflection_include_paths = default_include_paths(TRUE_FLATC_PATH)
|
||||||
|
reflection_include_paths_cmd = ["-I %s" % (s) for s in reflection_include_paths]
|
||||||
|
reflection_genrule_cmd = " ".join([
|
||||||
|
"SRCS=($(SRCS));",
|
||||||
|
"for f in $${SRCS[@]:0:%s}; do" % len(srcs),
|
||||||
|
"$(location %s)" % (TRUE_FLATC_PATH),
|
||||||
|
"-b --schema",
|
||||||
|
" ".join(flatc_args),
|
||||||
|
" ".join(reflection_include_paths_cmd),
|
||||||
|
language_flag,
|
||||||
|
output_directory,
|
||||||
|
"$$f;",
|
||||||
|
"done",
|
||||||
|
])
|
||||||
|
reflection_outs = [
|
||||||
|
(out_prefix + "%s.bfbs") % (s.replace(".fbs", "").split("/")[-1])
|
||||||
|
for s in srcs
|
||||||
|
]
|
||||||
|
native.genrule(
|
||||||
|
name = "%s_srcs" % reflection_name,
|
||||||
|
srcs = srcs + includes,
|
||||||
|
outs = reflection_outs,
|
||||||
|
output_to_bindir = output_to_bindir,
|
||||||
|
tools = [TRUE_FLATC_PATH],
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
target_compatible_with = target_compatible_with,
|
||||||
|
cmd = reflection_genrule_cmd,
|
||||||
|
message = "Generating flatbuffer reflection binary for %s:" % (name),
|
||||||
|
visibility = reflection_visibility,
|
||||||
|
)
|
||||||
|
native.filegroup(
|
||||||
|
name = "%s_out" % reflection_name,
|
||||||
|
srcs = reflection_outs,
|
||||||
|
visibility = reflection_visibility,
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
)
|
||||||
|
|
||||||
|
def flatbuffer_cc_library(
|
||||||
|
name,
|
||||||
|
srcs,
|
||||||
|
srcs_filegroup_name = "",
|
||||||
|
outs = [],
|
||||||
|
out_prefix = "",
|
||||||
|
deps = [],
|
||||||
|
includes = [],
|
||||||
|
include_paths = None,
|
||||||
|
cc_include_paths = [],
|
||||||
|
flatc_args = DEFAULT_FLATC_ARGS,
|
||||||
|
visibility = None,
|
||||||
|
compatible_with = None,
|
||||||
|
restricted_to = None,
|
||||||
|
target_compatible_with = None,
|
||||||
|
srcs_filegroup_visibility = None,
|
||||||
|
gen_reflections = False):
|
||||||
|
"""A cc_library with the generated reader/writers for the given flatbuffer definitions.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: Rule name.
|
||||||
|
srcs: Source .fbs files. Sent in order to the compiler.
|
||||||
|
srcs_filegroup_name: Name of the output filegroup that holds srcs. Pass this
|
||||||
|
filegroup into the `includes` parameter of any other
|
||||||
|
flatbuffer_cc_library that depends on this one's schemas.
|
||||||
|
outs: Additional outputs expected to be generated by flatc.
|
||||||
|
out_prefix: Prepend this path to the front of all generated files. Usually
|
||||||
|
is a directory name.
|
||||||
|
deps: Optional, list of other flatbuffer_cc_library's to depend on. Cannot be specified
|
||||||
|
alongside includes.
|
||||||
|
includes: Optional, list of filegroups of schemas that the srcs depend on.
|
||||||
|
Use of this is discouraged, and may be deprecated.
|
||||||
|
include_paths: Optional, list of paths the includes files can be found in.
|
||||||
|
cc_include_paths: Optional, list of paths to add to the cc_library includes attribute.
|
||||||
|
flatc_args: Optional list of additional arguments to pass to flatc
|
||||||
|
(e.g. --gen-mutable).
|
||||||
|
visibility: The visibility of the generated cc_library. By default, use the
|
||||||
|
default visibility of the project.
|
||||||
|
srcs_filegroup_visibility: The visibility of the generated srcs filegroup.
|
||||||
|
By default, use the value of the visibility parameter above.
|
||||||
|
gen_reflections: Optional, if true this will generate the flatbuffer
|
||||||
|
reflection binaries for the schemas.
|
||||||
|
compatible_with: Optional, The list of environments this rule can be built
|
||||||
|
for, in addition to default-supported environments.
|
||||||
|
restricted_to: Optional, The list of environments this rule can be built
|
||||||
|
for, instead of default-supported environments.
|
||||||
|
target_compatible_with: Optional, The list of target platform constraints
|
||||||
|
to use.
|
||||||
|
|
||||||
|
This produces:
|
||||||
|
filegroup([name]_srcs): all generated .h files.
|
||||||
|
filegroup(srcs_filegroup_name if specified, or [name]_includes if not):
|
||||||
|
Other flatbuffer_cc_library's can pass this in for their `includes`
|
||||||
|
parameter, if they depend on the schemas in this library.
|
||||||
|
Fileset([name]_reflection): (Optional) all generated reflection binaries.
|
||||||
|
cc_library([name]): library with sources and flatbuffers deps.
|
||||||
|
"""
|
||||||
|
output_headers = [
|
||||||
|
(out_prefix + "%s_generated.h") % (s.replace(".fbs", "").split("/")[-1].split(":")[-1])
|
||||||
|
for s in srcs
|
||||||
|
]
|
||||||
|
if deps and includes:
|
||||||
|
# There is no inherent reason we couldn't support both, but this discourages
|
||||||
|
# use of includes without good reason.
|
||||||
|
fail("Cannot specify both deps and include in flatbuffer_cc_library.")
|
||||||
|
if deps:
|
||||||
|
includes = [d + "_includes" for d in deps]
|
||||||
|
reflection_name = "%s_reflection" % name if gen_reflections else ""
|
||||||
|
|
||||||
|
srcs_lib = "%s_srcs" % (name)
|
||||||
|
flatbuffer_library_public(
|
||||||
|
name = srcs_lib,
|
||||||
|
srcs = srcs,
|
||||||
|
outs = outs + output_headers,
|
||||||
|
language_flag = "-c",
|
||||||
|
out_prefix = out_prefix,
|
||||||
|
includes = includes,
|
||||||
|
include_paths = include_paths,
|
||||||
|
flatc_args = flatc_args,
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
target_compatible_with = target_compatible_with,
|
||||||
|
reflection_name = reflection_name,
|
||||||
|
reflection_visibility = visibility,
|
||||||
|
)
|
||||||
|
cc_library(
|
||||||
|
name = name,
|
||||||
|
hdrs = [
|
||||||
|
":" + srcs_lib,
|
||||||
|
],
|
||||||
|
srcs = [
|
||||||
|
":" + srcs_lib,
|
||||||
|
],
|
||||||
|
features = [
|
||||||
|
"-parse_headers",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"@com_github_google_flatbuffers//:runtime_cc",
|
||||||
|
"@com_github_google_flatbuffers//:flatbuffers",
|
||||||
|
] + deps,
|
||||||
|
includes = cc_include_paths,
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
target_compatible_with = target_compatible_with,
|
||||||
|
linkstatic = 1,
|
||||||
|
visibility = visibility,
|
||||||
|
)
|
||||||
|
|
||||||
|
# A filegroup for the `srcs`. That is, all the schema files for this
|
||||||
|
# Flatbuffer set.
|
||||||
|
native.filegroup(
|
||||||
|
name = srcs_filegroup_name if srcs_filegroup_name else "%s_includes" % (name),
|
||||||
|
srcs = srcs + includes,
|
||||||
|
compatible_with = compatible_with,
|
||||||
|
restricted_to = restricted_to,
|
||||||
|
visibility = srcs_filegroup_visibility if srcs_filegroup_visibility != None else visibility,
|
||||||
|
)
|
||||||
18
third_party/flatbuffers/composer.json
vendored
Normal file
18
third_party/flatbuffers/composer.json
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "google/flatbuffers",
|
||||||
|
"type": "library",
|
||||||
|
"description": "FlatBuffers for PHP",
|
||||||
|
"keywords": ["google", "flatbuffers", "serialization"],
|
||||||
|
"homepage": "https://github.com/google/flatbuffers",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Google\\FlatBuffers\\": "php"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
12
third_party/flatbuffers/conan/CMakeLists.txt
vendored
Normal file
12
third_party/flatbuffers/conan/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
|
message(STATUS "Conan FlatBuffers Wrapper")
|
||||||
|
|
||||||
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
||||||
|
conan_basic_setup()
|
||||||
|
|
||||||
|
if (WIN32 AND MSVC_LIKE AND FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
|
endif(WIN32 AND MSVC_LIKE AND FLATBUFFERS_BUILD_SHAREDLIB)
|
||||||
|
|
||||||
|
include(${CMAKE_SOURCE_DIR}/CMakeListsOriginal.txt)
|
||||||
50
third_party/flatbuffers/conan/build.py
vendored
Normal file
50
third_party/flatbuffers/conan/build.py
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
from cpt.packager import ConanMultiPackager
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_branch():
|
||||||
|
try:
|
||||||
|
for line in subprocess.check_output("git branch", shell=True).decode().splitlines():
|
||||||
|
line = line.strip()
|
||||||
|
if line.startswith("*") and " (HEAD detached" not in line:
|
||||||
|
return line.replace("*", "", 1).strip()
|
||||||
|
return ""
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def get_version():
|
||||||
|
version = get_branch()
|
||||||
|
match = re.search(r"v(\d+\.\d+\.\d+.*)", version)
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
return version
|
||||||
|
|
||||||
|
|
||||||
|
def get_reference(username):
|
||||||
|
return "flatbuffers/{}@google/stable".format(get_version())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
login_username = os.getenv("CONAN_LOGIN_USERNAME", "aardappel")
|
||||||
|
username = os.getenv("CONAN_USERNAME", "google")
|
||||||
|
upload = os.getenv("CONAN_UPLOAD", "https://api.bintray.com/conan/aardappel/flatbuffers")
|
||||||
|
stable_branch_pattern = os.getenv("CONAN_STABLE_BRANCH_PATTERN", r"v\d+\.\d+\.\d+.*")
|
||||||
|
test_folder = os.getenv("CPT_TEST_FOLDER", os.path.join("conan", "test_package"))
|
||||||
|
upload_only_when_stable = os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", True)
|
||||||
|
|
||||||
|
builder = ConanMultiPackager(reference=get_reference(username),
|
||||||
|
username=username,
|
||||||
|
login_username=login_username,
|
||||||
|
upload=upload,
|
||||||
|
stable_branch_pattern=stable_branch_pattern,
|
||||||
|
upload_only_when_stable=upload_only_when_stable,
|
||||||
|
test_folder=test_folder)
|
||||||
|
builder.add_common_builds(pure_c=False)
|
||||||
|
builder.run()
|
||||||
9
third_party/flatbuffers/conan/test_package/CMakeLists.txt
vendored
Normal file
9
third_party/flatbuffers/conan/test_package/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
project(test_package CXX)
|
||||||
|
cmake_minimum_required(VERSION 2.8.11)
|
||||||
|
|
||||||
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
||||||
|
conan_basic_setup()
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} test_package.cpp)
|
||||||
|
target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})
|
||||||
|
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
|
||||||
21
third_party/flatbuffers/conan/test_package/conanfile.py
vendored
Normal file
21
third_party/flatbuffers/conan/test_package/conanfile.py
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from conans import ConanFile, CMake
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class TestPackageConan(ConanFile):
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
generators = "cmake"
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure()
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
bin_path = os.path.join("bin", "test_package")
|
||||||
|
self.run(bin_path, run_environment=True)
|
||||||
|
self.run("flatc --version", run_environment=True)
|
||||||
|
self.run("flathash fnv1_16 conan", run_environment=True)
|
||||||
35
third_party/flatbuffers/conan/test_package/test_package.cpp
vendored
Normal file
35
third_party/flatbuffers/conan/test_package/test_package.cpp
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include "flatbuffers/util.h"
|
||||||
|
|
||||||
|
// Test to validate Conan package generated
|
||||||
|
|
||||||
|
int main(int /*argc*/, const char * /*argv*/ []) {
|
||||||
|
|
||||||
|
const std::string filename("conanbuildinfo.cmake");
|
||||||
|
|
||||||
|
if (flatbuffers::FileExists(filename.c_str())) {
|
||||||
|
std::cout << "File " << filename << " exists.\n";
|
||||||
|
} else {
|
||||||
|
std::cout << "File " << filename << " does not exist.\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
75
third_party/flatbuffers/conanfile.py
vendored
Normal file
75
third_party/flatbuffers/conanfile.py
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""Conan recipe package for Google FlatBuffers
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
from conans import ConanFile, CMake, tools
|
||||||
|
|
||||||
|
|
||||||
|
class FlatbuffersConan(ConanFile):
|
||||||
|
name = "flatbuffers"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
url = "https://github.com/google/flatbuffers"
|
||||||
|
homepage = "http://google.github.io/flatbuffers/"
|
||||||
|
author = "Wouter van Oortmerssen"
|
||||||
|
topics = ("conan", "flatbuffers", "serialization", "rpc", "json-parser")
|
||||||
|
description = "Memory Efficient Serialization Library"
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
options = {"shared": [True, False], "fPIC": [True, False]}
|
||||||
|
default_options = {"shared": False, "fPIC": True}
|
||||||
|
generators = "cmake"
|
||||||
|
exports = "LICENSE"
|
||||||
|
exports_sources = ["CMake/*", "include/*", "src/*", "grpc/*", "CMakeLists.txt", "conan/CMakeLists.txt"]
|
||||||
|
|
||||||
|
def source(self):
|
||||||
|
"""Wrap the original CMake file to call conan_basic_setup
|
||||||
|
"""
|
||||||
|
shutil.move("CMakeLists.txt", "CMakeListsOriginal.txt")
|
||||||
|
shutil.move(os.path.join("conan", "CMakeLists.txt"), "CMakeLists.txt")
|
||||||
|
|
||||||
|
def config_options(self):
|
||||||
|
"""Remove fPIC option on Windows platform
|
||||||
|
"""
|
||||||
|
if self.settings.os == "Windows":
|
||||||
|
self.options.remove("fPIC")
|
||||||
|
|
||||||
|
def configure_cmake(self):
|
||||||
|
"""Create CMake instance and execute configure step
|
||||||
|
"""
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_TESTS"] = False
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_SHAREDLIB"] = self.options.shared
|
||||||
|
cmake.definitions["FLATBUFFERS_BUILD_FLATLIB"] = not self.options.shared
|
||||||
|
cmake.configure()
|
||||||
|
return cmake
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
"""Configure, build and install FlatBuffers using CMake.
|
||||||
|
"""
|
||||||
|
cmake = self.configure_cmake()
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def package(self):
|
||||||
|
"""Copy Flatbuffers' artifacts to package folder
|
||||||
|
"""
|
||||||
|
cmake = self.configure_cmake()
|
||||||
|
cmake.install()
|
||||||
|
self.copy(pattern="LICENSE", dst="licenses")
|
||||||
|
self.copy(pattern="FindFlatBuffers.cmake", dst=os.path.join("lib", "cmake", "flatbuffers"), src="CMake")
|
||||||
|
self.copy(pattern="flathash*", dst="bin", src="bin")
|
||||||
|
self.copy(pattern="flatc*", dst="bin", src="bin")
|
||||||
|
if self.settings.os == "Windows" and self.options.shared:
|
||||||
|
if self.settings.compiler == "Visual Studio":
|
||||||
|
shutil.move(os.path.join(self.package_folder, "lib", "%s.dll" % self.name),
|
||||||
|
os.path.join(self.package_folder, "bin", "%s.dll" % self.name))
|
||||||
|
elif self.settings.compiler == "gcc":
|
||||||
|
shutil.move(os.path.join(self.package_folder, "lib", "lib%s.dll" % self.name),
|
||||||
|
os.path.join(self.package_folder, "bin", "lib%s.dll" % self.name))
|
||||||
|
|
||||||
|
def package_info(self):
|
||||||
|
"""Collect built libraries names and solve flatc path.
|
||||||
|
"""
|
||||||
|
self.cpp_info.libs = tools.collect_libs(self)
|
||||||
|
self.user_info.flatc = os.path.join(self.package_folder, "bin", "flatc")
|
||||||
0
third_party/flatbuffers/grpc/BUILD.bazel
vendored
Normal file
0
third_party/flatbuffers/grpc/BUILD.bazel
vendored
Normal file
42
third_party/flatbuffers/grpc/README.md
vendored
Normal file
42
third_party/flatbuffers/grpc/README.md
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
GRPC implementation and test
|
||||||
|
============================
|
||||||
|
|
||||||
|
NOTE: files in `src/` are shared with the GRPC project, and maintained there
|
||||||
|
(any changes should be submitted to GRPC instead). These files are copied
|
||||||
|
from GRPC, and work with both the Protobuf and FlatBuffers code generator.
|
||||||
|
|
||||||
|
`tests/` contains a GRPC specific test, you need to have built and installed
|
||||||
|
the GRPC libraries for this to compile. This test will build using the
|
||||||
|
`FLATBUFFERS_BUILD_GRPCTEST` option to the main FlatBuffers CMake project.
|
||||||
|
|
||||||
|
## Building Flatbuffers with gRPC
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
1. Download, build and install gRPC. See [instructions](https://github.com/grpc/grpc/tree/master/src/cpp).
|
||||||
|
* Lets say your gRPC clone is at `/your/path/to/grpc_repo`.
|
||||||
|
* Install gRPC in a custom directory by running `make install prefix=/your/path/to/grpc_repo/install`.
|
||||||
|
2. `export GRPC_INSTALL_PATH=/your/path/to/grpc_repo/install`
|
||||||
|
3. `export PROTOBUF_DOWNLOAD_PATH=/your/path/to/grpc_repo/third_party/protobuf`
|
||||||
|
4. `mkdir build ; cd build`
|
||||||
|
5. `cmake -DFLATBUFFERS_BUILD_GRPCTEST=ON -DGRPC_INSTALL_PATH=${GRPC_INSTALL_PATH} -DPROTOBUF_DOWNLOAD_PATH=${PROTOBUF_DOWNLOAD_PATH} ..`
|
||||||
|
6. `make`
|
||||||
|
|
||||||
|
For Bazel users:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$bazel test src/compiler/...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running FlatBuffer gRPC tests
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
1. `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${GRPC_INSTALL_PATH}/lib`
|
||||||
|
2. `make test ARGS=-V`
|
||||||
|
|
||||||
|
For Bazel users:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$bazel test tests/...
|
||||||
|
```
|
||||||
13
third_party/flatbuffers/grpc/boringssl.patch
vendored
Normal file
13
third_party/flatbuffers/grpc/boringssl.patch
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 1645a264a..12f8ca999 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -635,6 +635,8 @@ add_library(
|
||||||
|
src/ssl/tls_record.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
+target_link_libraries(ssl crypto)
|
||||||
|
+
|
||||||
|
add_executable(
|
||||||
|
bssl
|
||||||
|
|
||||||
24
third_party/flatbuffers/grpc/build_grpc.sh
vendored
Normal file
24
third_party/flatbuffers/grpc/build_grpc.sh
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
grpc_1_39_0_githash=58602e20a3f3e48f24a4114c757099b25b947f7b
|
||||||
|
|
||||||
|
function build_grpc () {
|
||||||
|
git clone https://github.com/grpc/grpc.git google/grpc
|
||||||
|
cd google/grpc
|
||||||
|
git checkout ${grpc_1_39_0_githash}
|
||||||
|
git submodule update --init
|
||||||
|
# Apply boringssl build patch
|
||||||
|
cd third_party/boringssl-with-bazel
|
||||||
|
git apply ../../../../grpc/boringssl.patch
|
||||||
|
cd ../..
|
||||||
|
mkdir ../grpc_build
|
||||||
|
cd ../grpc_build
|
||||||
|
cmake ../grpc -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DABSL_ENABLE_INSTALL=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=`pwd`/../grpc/install
|
||||||
|
cmake --build . --target install ${JOBS:+-j$JOBS}
|
||||||
|
cd ../..
|
||||||
|
}
|
||||||
|
|
||||||
|
GRPC_INSTALL_PATH=`pwd`/google/grpc/install
|
||||||
|
PROTOBUF_DOWNLOAD_PATH=`pwd`/google/grpc/third_party/protobuf
|
||||||
|
|
||||||
|
build_grpc
|
||||||
10
third_party/flatbuffers/grpc/build_grpc_with_cxx14.patch
vendored
Normal file
10
third_party/flatbuffers/grpc/build_grpc_with_cxx14.patch
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
diff --git a/bazel/copts.bzl b/bazel/copts.bzl
|
||||||
|
index 10be944f25..879518b92f 100644
|
||||||
|
--- a/bazel/copts.bzl
|
||||||
|
+++ b/bazel/copts.bzl
|
||||||
|
@@ -59,4 +59,4 @@ GRPC_LLVM_WARNING_FLAGS = [
|
||||||
|
GRPC_DEFAULT_COPTS = select({
|
||||||
|
"//:use_strict_warning": GRPC_LLVM_WARNING_FLAGS + ["-DUSE_STRICT_WARNING=1"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
-})
|
||||||
|
+}) + ["-std=c++14"]
|
||||||
35
third_party/flatbuffers/grpc/examples/README.md
vendored
Normal file
35
third_party/flatbuffers/grpc/examples/README.md
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
## Languages known issues
|
||||||
|
|
||||||
|
### Python
|
||||||
|
|
||||||
|
- Assert the type required in your server/client since python is able to receive `Bytes array` or `utf8 strings`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def SayHello(self, request, context):
|
||||||
|
# request might be a byte array or a utf8 string
|
||||||
|
|
||||||
|
r = HelloRequest.HelloRequest().GetRootAs(request, 0)
|
||||||
|
reply = "Unknown"
|
||||||
|
if r.Name():
|
||||||
|
reply = r.Name()
|
||||||
|
# Issues might happen if type checking isnt present.
|
||||||
|
# thus encoding it as a `reply.decode('UTF-8')`
|
||||||
|
return build_reply("welcome " + reply.decode('UTF-8'))
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
This can be prevented by making sure all the requests coming to/from python are `Bytes array`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def say_hello(stub, builder):
|
||||||
|
hello_request = bytes(builder.Output())
|
||||||
|
reply = stub.SayHello(hello_request)
|
||||||
|
r = HelloReply.HelloReply.GetRootAs(reply)
|
||||||
|
print(r.Message())
|
||||||
|
```
|
||||||
|
|
||||||
|
### Go
|
||||||
|
|
||||||
|
- Always requires the `content-type` of the payload to be set to `application/grpc+flatbuffers`
|
||||||
|
|
||||||
|
example: `.SayHello(ctx, b, grpc.CallContentSubtype("flatbuffers"))`
|
||||||
36
third_party/flatbuffers/grpc/examples/go/format.sh
vendored
Normal file
36
third_party/flatbuffers/grpc/examples/go/format.sh
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright 2021 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
|
||||||
|
format_greeter() {
|
||||||
|
cd greeter
|
||||||
|
|
||||||
|
# Format client
|
||||||
|
cd client
|
||||||
|
gofmt -w .
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Format server
|
||||||
|
cd server
|
||||||
|
gofmt -w .
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
}
|
||||||
|
|
||||||
|
format_greeter
|
||||||
2
third_party/flatbuffers/grpc/examples/go/greeter/.gitignore
vendored
Normal file
2
third_party/flatbuffers/grpc/examples/go/greeter/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
**/server
|
||||||
|
**/client
|
||||||
25
third_party/flatbuffers/grpc/examples/go/greeter/README.md
vendored
Normal file
25
third_party/flatbuffers/grpc/examples/go/greeter/README.md
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Go Greeter example
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
.
|
||||||
|
├── server # Server module
|
||||||
|
├── client # Client module
|
||||||
|
├── models # Flatbuffers models & main grpc code.
|
||||||
|
└── README.md
|
||||||
|
|
||||||
|
## How to run Server:
|
||||||
|
|
||||||
|
- `cd server`
|
||||||
|
|
||||||
|
- `go clean`
|
||||||
|
|
||||||
|
- `go run main.go`
|
||||||
|
|
||||||
|
## How to run Client:
|
||||||
|
|
||||||
|
- `cd client`
|
||||||
|
|
||||||
|
- `go clean`
|
||||||
|
|
||||||
|
- `go run main.go --name NAME`
|
||||||
158
third_party/flatbuffers/grpc/examples/go/greeter/models/Greeter_grpc.go
vendored
Normal file
158
third_party/flatbuffers/grpc/examples/go/greeter/models/Greeter_grpc.go
vendored
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
//Generated by gRPC Go plugin
|
||||||
|
//If you make any local changes, they will be lost
|
||||||
|
//source: greeter
|
||||||
|
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
flatbuffers "github.com/google/flatbuffers/go"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Client API for Greeter service
|
||||||
|
type GreeterClient interface {
|
||||||
|
SayHello(ctx context.Context, in *flatbuffers.Builder,
|
||||||
|
opts ...grpc.CallOption) (*HelloReply, error)
|
||||||
|
SayManyHellos(ctx context.Context, in *flatbuffers.Builder,
|
||||||
|
opts ...grpc.CallOption) (Greeter_SayManyHellosClient, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type greeterClient struct {
|
||||||
|
cc grpc.ClientConnInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
|
||||||
|
return &greeterClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *greeterClient) SayHello(ctx context.Context, in *flatbuffers.Builder,
|
||||||
|
opts ...grpc.CallOption) (*HelloReply, error) {
|
||||||
|
out := new(HelloReply)
|
||||||
|
err := c.cc.Invoke(ctx, "/models.Greeter/SayHello", in, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *greeterClient) SayManyHellos(ctx context.Context, in *flatbuffers.Builder,
|
||||||
|
opts ...grpc.CallOption) (Greeter_SayManyHellosClient, error) {
|
||||||
|
stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], "/models.Greeter/SayManyHellos", opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
x := &greeterSayManyHellosClient{stream}
|
||||||
|
if err := x.ClientStream.SendMsg(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := x.ClientStream.CloseSend(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return x, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Greeter_SayManyHellosClient interface {
|
||||||
|
Recv() (*HelloReply, error)
|
||||||
|
grpc.ClientStream
|
||||||
|
}
|
||||||
|
|
||||||
|
type greeterSayManyHellosClient struct {
|
||||||
|
grpc.ClientStream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *greeterSayManyHellosClient) Recv() (*HelloReply, error) {
|
||||||
|
m := new(HelloReply)
|
||||||
|
if err := x.ClientStream.RecvMsg(m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for Greeter service
|
||||||
|
type GreeterServer interface {
|
||||||
|
SayHello(context.Context, *HelloRequest) (*flatbuffers.Builder, error)
|
||||||
|
SayManyHellos(*HelloRequest, Greeter_SayManyHellosServer) error
|
||||||
|
mustEmbedUnimplementedGreeterServer()
|
||||||
|
}
|
||||||
|
|
||||||
|
type UnimplementedGreeterServer struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*flatbuffers.Builder, error) {
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (UnimplementedGreeterServer) SayManyHellos(*HelloRequest, Greeter_SayManyHellosServer) error {
|
||||||
|
return status.Errorf(codes.Unimplemented, "method SayManyHellos not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (UnimplementedGreeterServer) mustEmbedUnimplementedGreeterServer() {}
|
||||||
|
|
||||||
|
type UnsafeGreeterServer interface {
|
||||||
|
mustEmbedUnimplementedGreeterServer()
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterGreeterServer(s grpc.ServiceRegistrar, srv GreeterServer) {
|
||||||
|
s.RegisterService(&_Greeter_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context,
|
||||||
|
dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(HelloRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(GreeterServer).SayHello(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/models.Greeter/SayHello",
|
||||||
|
}
|
||||||
|
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
func _Greeter_SayManyHellos_Handler(srv interface{}, stream grpc.ServerStream) error {
|
||||||
|
m := new(HelloRequest)
|
||||||
|
if err := stream.RecvMsg(m); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return srv.(GreeterServer).SayManyHellos(m, &greeterSayManyHellosServer{stream})
|
||||||
|
}
|
||||||
|
|
||||||
|
type Greeter_SayManyHellosServer interface {
|
||||||
|
Send(*flatbuffers.Builder) error
|
||||||
|
grpc.ServerStream
|
||||||
|
}
|
||||||
|
|
||||||
|
type greeterSayManyHellosServer struct {
|
||||||
|
grpc.ServerStream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *greeterSayManyHellosServer) Send(m *flatbuffers.Builder) error {
|
||||||
|
return x.ServerStream.SendMsg(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _Greeter_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "models.Greeter",
|
||||||
|
HandlerType: (*GreeterServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "SayHello",
|
||||||
|
Handler: _Greeter_SayHello_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{
|
||||||
|
{
|
||||||
|
StreamName: "SayManyHellos",
|
||||||
|
Handler: _Greeter_SayManyHellos_Handler,
|
||||||
|
ServerStreams: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
60
third_party/flatbuffers/grpc/examples/go/greeter/models/HelloReply.go
vendored
Normal file
60
third_party/flatbuffers/grpc/examples/go/greeter/models/HelloReply.go
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
|
||||||
|
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
flatbuffers "github.com/google/flatbuffers/go"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HelloReply struct {
|
||||||
|
_tab flatbuffers.Table
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRootAsHelloReply(buf []byte, offset flatbuffers.UOffsetT) *HelloReply {
|
||||||
|
n := flatbuffers.GetUOffsetT(buf[offset:])
|
||||||
|
x := &HelloReply{}
|
||||||
|
x.Init(buf, n+offset)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func FinishHelloReplyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||||
|
builder.Finish(offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSizePrefixedRootAsHelloReply(buf []byte, offset flatbuffers.UOffsetT) *HelloReply {
|
||||||
|
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
|
||||||
|
x := &HelloReply{}
|
||||||
|
x.Init(buf, n+offset+flatbuffers.SizeUint32)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func FinishSizePrefixedHelloReplyBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||||
|
builder.FinishSizePrefixed(offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloReply) Init(buf []byte, i flatbuffers.UOffsetT) {
|
||||||
|
rcv._tab.Bytes = buf
|
||||||
|
rcv._tab.Pos = i
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloReply) Table() flatbuffers.Table {
|
||||||
|
return rcv._tab
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloReply) Message() []byte {
|
||||||
|
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||||
|
if o != 0 {
|
||||||
|
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func HelloReplyStart(builder *flatbuffers.Builder) {
|
||||||
|
builder.StartObject(1)
|
||||||
|
}
|
||||||
|
func HelloReplyAddMessage(builder *flatbuffers.Builder, message flatbuffers.UOffsetT) {
|
||||||
|
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(message), 0)
|
||||||
|
}
|
||||||
|
func HelloReplyEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||||
|
return builder.EndObject()
|
||||||
|
}
|
||||||
60
third_party/flatbuffers/grpc/examples/go/greeter/models/HelloRequest.go
vendored
Normal file
60
third_party/flatbuffers/grpc/examples/go/greeter/models/HelloRequest.go
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
|
||||||
|
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
flatbuffers "github.com/google/flatbuffers/go"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HelloRequest struct {
|
||||||
|
_tab flatbuffers.Table
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRootAsHelloRequest(buf []byte, offset flatbuffers.UOffsetT) *HelloRequest {
|
||||||
|
n := flatbuffers.GetUOffsetT(buf[offset:])
|
||||||
|
x := &HelloRequest{}
|
||||||
|
x.Init(buf, n+offset)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func FinishHelloRequestBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||||
|
builder.Finish(offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSizePrefixedRootAsHelloRequest(buf []byte, offset flatbuffers.UOffsetT) *HelloRequest {
|
||||||
|
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
|
||||||
|
x := &HelloRequest{}
|
||||||
|
x.Init(buf, n+offset+flatbuffers.SizeUint32)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func FinishSizePrefixedHelloRequestBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
|
||||||
|
builder.FinishSizePrefixed(offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloRequest) Init(buf []byte, i flatbuffers.UOffsetT) {
|
||||||
|
rcv._tab.Bytes = buf
|
||||||
|
rcv._tab.Pos = i
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloRequest) Table() flatbuffers.Table {
|
||||||
|
return rcv._tab
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rcv *HelloRequest) Name() []byte {
|
||||||
|
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
|
||||||
|
if o != 0 {
|
||||||
|
return rcv._tab.ByteVector(o + rcv._tab.Pos)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func HelloRequestStart(builder *flatbuffers.Builder) {
|
||||||
|
builder.StartObject(1)
|
||||||
|
}
|
||||||
|
func HelloRequestAddName(builder *flatbuffers.Builder, name flatbuffers.UOffsetT) {
|
||||||
|
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(name), 0)
|
||||||
|
}
|
||||||
|
func HelloRequestEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
|
||||||
|
return builder.EndObject()
|
||||||
|
}
|
||||||
8
third_party/flatbuffers/grpc/examples/go/greeter/models/go.mod
vendored
Normal file
8
third_party/flatbuffers/grpc/examples/go/greeter/models/go.mod
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
module github.com/google/flatbuffers/grpc/examples/go/greeter/models
|
||||||
|
|
||||||
|
go 1.15
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/google/flatbuffers v2.0.8+incompatible
|
||||||
|
google.golang.org/grpc v1.56.3
|
||||||
|
)
|
||||||
14
third_party/flatbuffers/grpc/examples/greeter.fbs
vendored
Normal file
14
third_party/flatbuffers/grpc/examples/greeter.fbs
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace models;
|
||||||
|
|
||||||
|
table HelloReply {
|
||||||
|
message:string;
|
||||||
|
}
|
||||||
|
|
||||||
|
table HelloRequest {
|
||||||
|
name:string;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpc_service Greeter {
|
||||||
|
SayHello(HelloRequest):HelloReply;
|
||||||
|
SayManyHellos(HelloRequest):HelloReply (streaming: "server");
|
||||||
|
}
|
||||||
12
third_party/flatbuffers/grpc/examples/python/greeter/README.md
vendored
Normal file
12
third_party/flatbuffers/grpc/examples/python/greeter/README.md
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Python Greeter example
|
||||||
|
|
||||||
|
## Prerequisite
|
||||||
|
|
||||||
|
- You need to have grpc python installed on your device `pip install grpcio`
|
||||||
|
## How to run Server:
|
||||||
|
|
||||||
|
- `python server.py ${PORT}`
|
||||||
|
|
||||||
|
## How to run Client:
|
||||||
|
|
||||||
|
- `python client.py ${PORT} ${NAME}`
|
||||||
40
third_party/flatbuffers/grpc/examples/python/greeter/client.py
vendored
Normal file
40
third_party/flatbuffers/grpc/examples/python/greeter/client.py
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import grpc
|
||||||
|
|
||||||
|
sys.path.insert(0, '../../../../../flatbuffers/python')
|
||||||
|
|
||||||
|
import flatbuffers
|
||||||
|
from models import HelloReply, HelloRequest, greeter_grpc_fb
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("port", help="server port to connect to", default=3000)
|
||||||
|
parser.add_argument("name", help="name to be sent to server", default="flatbuffers")
|
||||||
|
|
||||||
|
def say_hello(stub, hello_request):
|
||||||
|
reply = stub.SayHello(hello_request)
|
||||||
|
r = HelloReply.HelloReply.GetRootAs(reply)
|
||||||
|
print(r.Message())
|
||||||
|
|
||||||
|
def say_many_hellos(stub, hello_request):
|
||||||
|
greetings = stub.SayManyHellos(hello_request)
|
||||||
|
for greeting in greetings:
|
||||||
|
r = HelloReply.HelloReply.GetRootAs(greeting)
|
||||||
|
print(r.Message())
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
with grpc.insecure_channel('localhost:' + args.port) as channel:
|
||||||
|
builder = flatbuffers.Builder()
|
||||||
|
ind = builder.CreateString(args.name)
|
||||||
|
HelloRequest.HelloRequestStart(builder)
|
||||||
|
HelloRequest.HelloRequestAddName(builder, ind)
|
||||||
|
root = HelloRequest.HelloRequestEnd(builder)
|
||||||
|
builder.Finish(root)
|
||||||
|
output = bytes(builder.Output())
|
||||||
|
stub = greeter_grpc_fb.GreeterStub(channel)
|
||||||
|
say_hello(stub, output)
|
||||||
|
say_many_hellos(stub, output)
|
||||||
|
|
||||||
|
main()
|
||||||
50
third_party/flatbuffers/grpc/examples/python/greeter/models/HelloReply.py
vendored
Normal file
50
third_party/flatbuffers/grpc/examples/python/greeter/models/HelloReply.py
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
# namespace: models
|
||||||
|
|
||||||
|
import flatbuffers
|
||||||
|
from flatbuffers.compat import import_numpy
|
||||||
|
np = import_numpy()
|
||||||
|
|
||||||
|
class HelloReply(object):
|
||||||
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def GetRootAs(cls, buf, offset=0):
|
||||||
|
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
|
||||||
|
x = HelloReply()
|
||||||
|
x.Init(buf, n + offset)
|
||||||
|
return x
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def GetRootAsHelloReply(cls, buf, offset=0):
|
||||||
|
"""This method is deprecated. Please switch to GetRootAs."""
|
||||||
|
return cls.GetRootAs(buf, offset)
|
||||||
|
# HelloReply
|
||||||
|
def Init(self, buf, pos):
|
||||||
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|
||||||
|
# HelloReply
|
||||||
|
def Message(self):
|
||||||
|
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
|
||||||
|
if o != 0:
|
||||||
|
return self._tab.String(o + self._tab.Pos)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def HelloReplyStart(builder):
|
||||||
|
builder.StartObject(1)
|
||||||
|
|
||||||
|
def Start(builder):
|
||||||
|
HelloReplyStart(builder)
|
||||||
|
|
||||||
|
def HelloReplyAddMessage(builder, message):
|
||||||
|
builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(message), 0)
|
||||||
|
|
||||||
|
def AddMessage(builder, message):
|
||||||
|
HelloReplyAddMessage(builder, message)
|
||||||
|
|
||||||
|
def HelloReplyEnd(builder):
|
||||||
|
return builder.EndObject()
|
||||||
|
|
||||||
|
def End(builder):
|
||||||
|
return HelloReplyEnd(builder)
|
||||||
50
third_party/flatbuffers/grpc/examples/python/greeter/models/HelloRequest.py
vendored
Normal file
50
third_party/flatbuffers/grpc/examples/python/greeter/models/HelloRequest.py
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# automatically generated by the FlatBuffers compiler, do not modify
|
||||||
|
|
||||||
|
# namespace: models
|
||||||
|
|
||||||
|
import flatbuffers
|
||||||
|
from flatbuffers.compat import import_numpy
|
||||||
|
np = import_numpy()
|
||||||
|
|
||||||
|
class HelloRequest(object):
|
||||||
|
__slots__ = ['_tab']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def GetRootAs(cls, buf, offset=0):
|
||||||
|
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
|
||||||
|
x = HelloRequest()
|
||||||
|
x.Init(buf, n + offset)
|
||||||
|
return x
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def GetRootAsHelloRequest(cls, buf, offset=0):
|
||||||
|
"""This method is deprecated. Please switch to GetRootAs."""
|
||||||
|
return cls.GetRootAs(buf, offset)
|
||||||
|
# HelloRequest
|
||||||
|
def Init(self, buf, pos):
|
||||||
|
self._tab = flatbuffers.table.Table(buf, pos)
|
||||||
|
|
||||||
|
# HelloRequest
|
||||||
|
def Name(self):
|
||||||
|
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
|
||||||
|
if o != 0:
|
||||||
|
return self._tab.String(o + self._tab.Pos)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def HelloRequestStart(builder):
|
||||||
|
builder.StartObject(1)
|
||||||
|
|
||||||
|
def Start(builder):
|
||||||
|
HelloRequestStart(builder)
|
||||||
|
|
||||||
|
def HelloRequestAddName(builder, name):
|
||||||
|
builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)
|
||||||
|
|
||||||
|
def AddName(builder, name):
|
||||||
|
HelloRequestAddName(builder, name)
|
||||||
|
|
||||||
|
def HelloRequestEnd(builder):
|
||||||
|
return builder.EndObject()
|
||||||
|
|
||||||
|
def End(builder):
|
||||||
|
return HelloRequestEnd(builder)
|
||||||
0
third_party/flatbuffers/grpc/examples/python/greeter/models/__init__.py
vendored
Normal file
0
third_party/flatbuffers/grpc/examples/python/greeter/models/__init__.py
vendored
Normal file
52
third_party/flatbuffers/grpc/examples/python/greeter/models/greeter_grpc_fb.py
vendored
Normal file
52
third_party/flatbuffers/grpc/examples/python/greeter/models/greeter_grpc_fb.py
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
||||||
|
|
||||||
|
import grpc
|
||||||
|
|
||||||
|
class GreeterStub(object):
|
||||||
|
""" Interface exported by the server. """
|
||||||
|
|
||||||
|
def __init__(self, channel):
|
||||||
|
""" Constructor.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
channel: A grpc.Channel.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.SayHello = channel.unary_unary(
|
||||||
|
"/models.Greeter/SayHello"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.SayManyHellos = channel.unary_stream(
|
||||||
|
"/models.Greeter/SayManyHellos"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class GreeterServicer(object):
|
||||||
|
""" Interface exported by the server. """
|
||||||
|
|
||||||
|
def SayHello(self, request, context):
|
||||||
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
||||||
|
context.set_details('Method not implemented!')
|
||||||
|
raise NotImplementedError('Method not implemented!')
|
||||||
|
|
||||||
|
|
||||||
|
def SayManyHellos(self, request, context):
|
||||||
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
||||||
|
context.set_details('Method not implemented!')
|
||||||
|
raise NotImplementedError('Method not implemented!')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def add_GreeterServicer_to_server(servicer, server):
|
||||||
|
rpc_method_handlers = {
|
||||||
|
'SayHello': grpc.unary_unary_rpc_method_handler(
|
||||||
|
servicer.SayHello
|
||||||
|
),
|
||||||
|
'SayManyHellos': grpc.unary_stream_rpc_method_handler(
|
||||||
|
servicer.SayManyHellos
|
||||||
|
),
|
||||||
|
}
|
||||||
|
generic_handler = grpc.method_handlers_generic_handler(
|
||||||
|
'models.Greeter', rpc_method_handlers)
|
||||||
|
server.add_generic_rpc_handlers((generic_handler,))
|
||||||
|
|
||||||
57
third_party/flatbuffers/grpc/examples/python/greeter/server.py
vendored
Normal file
57
third_party/flatbuffers/grpc/examples/python/greeter/server.py
vendored
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
from concurrent import futures
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import grpc
|
||||||
|
|
||||||
|
sys.path.insert(0, '../../../../../flatbuffers/python')
|
||||||
|
|
||||||
|
import flatbuffers
|
||||||
|
from models import HelloReply, HelloRequest, greeter_grpc_fb
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("port", help="server on port", default=3000)
|
||||||
|
|
||||||
|
def build_reply(message):
|
||||||
|
builder = flatbuffers.Builder()
|
||||||
|
ind = builder.CreateString(message)
|
||||||
|
HelloReply.HelloReplyStart(builder)
|
||||||
|
HelloReply.HelloReplyAddMessage(builder, ind)
|
||||||
|
root = HelloReply.HelloReplyEnd(builder)
|
||||||
|
builder.Finish(root)
|
||||||
|
return bytes(builder.Output())
|
||||||
|
|
||||||
|
class GreeterServicer(greeter_grpc_fb.GreeterServicer):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.greetings = ["Hi", "Hallo", "Ciao"]
|
||||||
|
|
||||||
|
def SayHello(self, request, context):
|
||||||
|
r = HelloRequest.HelloRequest().GetRootAs(request, 0)
|
||||||
|
reply = "Unknown"
|
||||||
|
if r.Name():
|
||||||
|
reply = r.Name()
|
||||||
|
return build_reply("welcome " + reply.decode('UTF-8'))
|
||||||
|
|
||||||
|
def SayManyHellos(self, request, context):
|
||||||
|
r = HelloRequest.HelloRequest().GetRootAs(request, 0)
|
||||||
|
reply = "Unknown"
|
||||||
|
if r.Name():
|
||||||
|
reply = r.Name()
|
||||||
|
|
||||||
|
for greeting in self.greetings:
|
||||||
|
print(type(reply))
|
||||||
|
yield build_reply(greeting + " " + reply.decode('UTF-8'))
|
||||||
|
|
||||||
|
|
||||||
|
def serve():
|
||||||
|
args = parser.parse_args()
|
||||||
|
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
||||||
|
greeter_grpc_fb.add_GreeterServicer_to_server(
|
||||||
|
GreeterServicer(), server
|
||||||
|
)
|
||||||
|
server.add_insecure_port('[::]:' + args.port)
|
||||||
|
server.start()
|
||||||
|
server.wait_for_termination()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
serve()
|
||||||
58
third_party/flatbuffers/grpc/examples/swift/Greeter/Package.swift
vendored
Normal file
58
third_party/flatbuffers/grpc/examples/swift/Greeter/Package.swift
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// swift-tools-version:5.1
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "Greeter",
|
||||||
|
platforms: [
|
||||||
|
.iOS(.v11),
|
||||||
|
.macOS(.v10_14),
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
.package(path: "../../../../swift"),
|
||||||
|
.package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0"),
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
||||||
|
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
|
||||||
|
.target(
|
||||||
|
name: "Model",
|
||||||
|
dependencies: [
|
||||||
|
"GRPC",
|
||||||
|
"FlatBuffers",
|
||||||
|
],
|
||||||
|
path: "Sources/Model"),
|
||||||
|
|
||||||
|
// Client for the Greeter example
|
||||||
|
.target(
|
||||||
|
name: "Client",
|
||||||
|
dependencies: [
|
||||||
|
"GRPC",
|
||||||
|
"Model",
|
||||||
|
],
|
||||||
|
path: "Sources/client"),
|
||||||
|
|
||||||
|
// Server for the Greeter example
|
||||||
|
.target(
|
||||||
|
name: "Server",
|
||||||
|
dependencies: [
|
||||||
|
"GRPC",
|
||||||
|
"Model",
|
||||||
|
],
|
||||||
|
path: "Sources/server"),
|
||||||
|
])
|
||||||
7
third_party/flatbuffers/grpc/examples/swift/Greeter/README.md
vendored
Normal file
7
third_party/flatbuffers/grpc/examples/swift/Greeter/README.md
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# FlatBuffers.GRPC.Swift
|
||||||
|
|
||||||
|
The following is Swift example on how GRPC would be with Swift Flatbuffers, you can simply run the following commands:
|
||||||
|
|
||||||
|
`swift run Server`
|
||||||
|
|
||||||
|
`swift run Client {port} {name}`
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user