From 4826c5e59cbe2686722663978a937fd52929ef5d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 12 Jul 2023 17:04:04 +0200 Subject: [PATCH] Write module files and include it in the top-level --- crates/re_types/source_hash.txt | 2 +- crates/re_types_builder/src/codegen/cpp.rs | 52 +++++++++++++++++----- rerun_cpp/src/archetypes.hpp | 7 +++ rerun_cpp/src/components.hpp | 14 ++++++ rerun_cpp/src/datatypes.hpp | 19 ++++++++ rerun_cpp/src/rerun.hpp | 6 +++ 6 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 rerun_cpp/src/archetypes.hpp create mode 100644 rerun_cpp/src/components.hpp create mode 100644 rerun_cpp/src/datatypes.hpp diff --git a/crates/re_types/source_hash.txt b/crates/re_types/source_hash.txt index a37cc9c3e2e0..43d55f642898 100644 --- a/crates/re_types/source_hash.txt +++ b/crates/re_types/source_hash.txt @@ -1,4 +1,4 @@ # This is a sha256 hash for all direct and indirect dependencies of this crate's build script. # It can be safely removed at anytime to force the build script to run again. # Check out build.rs to see how it's computed. -08ff48565c52ba1b521525e867d963c674d5c61a097d529c0751f1ec08c154ce +6d6e6a58aed84a5b4282f17bacbd5c0dc0553798d35a9d61898feb77eee342da diff --git a/crates/re_types_builder/src/codegen/cpp.rs b/crates/re_types_builder/src/codegen/cpp.rs index 1dd988be1575..0f05965512de 100644 --- a/crates/re_types_builder/src/codegen/cpp.rs +++ b/crates/re_types_builder/src/codegen/cpp.rs @@ -1,11 +1,11 @@ use std::collections::BTreeSet; use anyhow::Context as _; -use camino::Utf8PathBuf; +use camino::{Utf8Path, Utf8PathBuf}; use proc_macro2::TokenStream; use quote::{format_ident, quote}; -use crate::{codegen::AUTOGEN_WARNING, ArrowRegistry, Object, ObjectKind, Objects}; +use crate::{codegen::AUTOGEN_WARNING, ArrowRegistry, ObjectKind, Objects}; const NEWLINE_TOKEN: &str = "RE_TOKEN_NEWLINE"; @@ -27,23 +27,46 @@ impl CppCodeGenerator { object_kind: ObjectKind, folder_name: &str, ) -> BTreeSet { - let mut filepaths = BTreeSet::default(); - let folder_path = self.output_path.join(folder_name); std::fs::create_dir_all(&folder_path) .with_context(|| format!("{folder_path:?}")) .unwrap(); - for obj in objects.ordered_objects(object_kind.into()) { + + let mut filepaths = BTreeSet::default(); + + // Generate folder contents: + let ordered_objects = objects.ordered_objects(object_kind.into()); + for &obj in &ordered_objects { let filename = obj.snake_case_name(); let (hpp, cpp) = generate_hpp_cpp(objects, arrow_registry, obj); for (extension, tokens) in [("hpp", hpp), ("cpp", cpp)] { - let string = string_from_token_stream(obj, &tokens); + let string = string_from_token_stream(&tokens, obj.relative_filepath()); let filepath = folder_path.join(format!("{filename}.{extension}")); write_file(&filepath, string); filepaths.insert(filepath); } } + { + // Generate module file that includes all the headers: + let hash = quote! { # }; + let pragma_once = pragma_once(); + let header_file_names = ordered_objects + .iter() + .map(|obj| format!("{folder_name}/{}.hpp", obj.snake_case_name())); + let tokens = quote! { + #pragma_once + #(#hash include #header_file_names "RE_TOKEN_NEWLINE")* + }; + let filepath = folder_path + .parent() + .unwrap() + .join(format!("{folder_name}.hpp")); + let string = string_from_token_stream(&tokens, None); + write_file(&filepath, string); + filepaths.insert(filepath); + } + // Clean up old files: for entry in std::fs::read_dir(folder_path).unwrap().flatten() { let filepath = Utf8PathBuf::try_from(entry.path()).unwrap(); @@ -78,11 +101,11 @@ impl crate::CodeGenerator for CppCodeGenerator { } } -fn string_from_token_stream(obj: &Object, token_stream: &TokenStream) -> String { +fn string_from_token_stream(token_stream: &TokenStream, source_path: Option<&Utf8Path>) -> String { let mut code = String::new(); code.push_str(&format!("// {AUTOGEN_WARNING}\n")); - if let Some(relative_path) = obj.relative_filepath() { - code.push_str(&format!("// Based on {relative_path:?}")); + if let Some(source_path) = source_path { + code.push_str(&format!("// Based on {source_path:?}")); } code.push('\n'); @@ -127,11 +150,11 @@ fn generate_hpp_cpp( let snake_case_name = obj.snake_case_name(); let hash = quote! { # }; + let pragma_once = pragma_once(); let header_file_name = format!("{snake_case_name}.hpp"); let hpp = quote! { - #hash pragma once #NEWLINE_TOKEN #NEWLINE_TOKEN - + #pragma_once namespace rr { namespace #obj_kind_ident { struct #pascal_case_ident { }; @@ -142,3 +165,10 @@ fn generate_hpp_cpp( (hpp, cpp) } + +fn pragma_once() -> TokenStream { + let hash = quote! { # }; + quote! { + #hash pragma once #NEWLINE_TOKEN #NEWLINE_TOKEN + } +} diff --git a/rerun_cpp/src/archetypes.hpp b/rerun_cpp/src/archetypes.hpp new file mode 100644 index 000000000000..ea2f4b62387e --- /dev/null +++ b/rerun_cpp/src/archetypes.hpp @@ -0,0 +1,7 @@ +// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT. + +#pragma once + +#include "archetypes/fuzzy.hpp" +#include "archetypes/points2d.hpp" +#include "archetypes/transform3d.hpp" diff --git a/rerun_cpp/src/components.hpp b/rerun_cpp/src/components.hpp new file mode 100644 index 000000000000..f4c9ad2bbebc --- /dev/null +++ b/rerun_cpp/src/components.hpp @@ -0,0 +1,14 @@ +// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT. + +#pragma once + +#include "components/class_id.hpp" +#include "components/color.hpp" +#include "components/draw_order.hpp" +#include "components/fuzzy.hpp" +#include "components/instance_key.hpp" +#include "components/keypoint_id.hpp" +#include "components/label.hpp" +#include "components/point2d.hpp" +#include "components/radius.hpp" +#include "components/transform3d.hpp" diff --git a/rerun_cpp/src/datatypes.hpp b/rerun_cpp/src/datatypes.hpp new file mode 100644 index 000000000000..84f71f6dc827 --- /dev/null +++ b/rerun_cpp/src/datatypes.hpp @@ -0,0 +1,19 @@ +// NOTE: This file was autogenerated by re_types_builder; DO NOT EDIT. + +#pragma once + +#include "datatypes/angle.hpp" +#include "datatypes/fuzzy.hpp" +#include "datatypes/mat3x3.hpp" +#include "datatypes/mat4x4.hpp" +#include "datatypes/point2d.hpp" +#include "datatypes/quaternion.hpp" +#include "datatypes/rotation3d.hpp" +#include "datatypes/rotation_axis_angle.hpp" +#include "datatypes/scale3d.hpp" +#include "datatypes/transform3d.hpp" +#include "datatypes/translation_and_mat3x3.hpp" +#include "datatypes/translation_rotation_scale3d.hpp" +#include "datatypes/vec2d.hpp" +#include "datatypes/vec3d.hpp" +#include "datatypes/vec4d.hpp" diff --git a/rerun_cpp/src/rerun.hpp b/rerun_cpp/src/rerun.hpp index adb28a7d1ef4..a8e8c27a99c0 100644 --- a/rerun_cpp/src/rerun.hpp +++ b/rerun_cpp/src/rerun.hpp @@ -1,6 +1,12 @@ // The Rerun C++ SDK. #pragma once +// Auto-generated: +#include "archetypes.hpp" +#include "components.hpp" +#include "datatypes.hpp" + +// Manually written: #include "recording_stream.hpp" namespace rr {