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