From 9179783906d23d5fcebca615daa4e48060ab7376 Mon Sep 17 00:00:00 2001 From: Peter van der Perk Date: Thu, 4 Aug 2022 23:08:38 +0200 Subject: [PATCH] Embedded Template Library (ETL) Example application --- examples/etl/Kconfig | 12 ++++ examples/etl/Make.defs | 23 ++++++ examples/etl/Makefile | 34 +++++++++ examples/etl/etl_main.cxx | 144 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 examples/etl/Kconfig create mode 100644 examples/etl/Make.defs create mode 100644 examples/etl/Makefile create mode 100644 examples/etl/etl_main.cxx diff --git a/examples/etl/Kconfig b/examples/etl/Kconfig new file mode 100644 index 000000000..b555273b6 --- /dev/null +++ b/examples/etl/Kconfig @@ -0,0 +1,12 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config EXAMPLES_ETL + tristate "Embedded Template Library (ETL) C++ example" + default n + depends on HAVE_CXX && ETL + ---help--- + Enable the ETL C++ example which showcases the etl::vector container + and C++11 iterator diff --git a/examples/etl/Make.defs b/examples/etl/Make.defs new file mode 100644 index 000000000..69c0b8cc1 --- /dev/null +++ b/examples/etl/Make.defs @@ -0,0 +1,23 @@ +############################################################################ +# apps/examples/helloxx/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you 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. +# +############################################################################ + +ifneq ($(CONFIG_EXAMPLES_ETL),) +CONFIGURED_APPS += $(APPDIR)/examples/etl +endif diff --git a/examples/etl/Makefile b/examples/etl/Makefile new file mode 100644 index 000000000..f273f4fa7 --- /dev/null +++ b/examples/etl/Makefile @@ -0,0 +1,34 @@ +############################################################################ +# apps/examples/etl/Makefile +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you 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 $(APPDIR)/Make.defs + +# ETL C++ Example + +MAINSRC = etl_main.cxx + +# etl built-in application info + +PROGNAME = etl +PRIORITY = SCHED_PRIORITY_DEFAULT +STACKSIZE = $(CONFIG_DEFAULT_TASK_STACKSIZE) +MODULE = $(CONFIG_EXAMPLES_HELLOXX) + +include $(APPDIR)/Application.mk diff --git a/examples/etl/etl_main.cxx b/examples/etl/etl_main.cxx new file mode 100644 index 000000000..81dee676b --- /dev/null +++ b/examples/etl/etl_main.cxx @@ -0,0 +1,144 @@ +//*************************************************************************** +// apps/examples/etl/etl_main.cxx +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. The +// ASF licenses this file to you 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. +// +//*************************************************************************** + +//*************************************************************************** +// Included Files +//*************************************************************************** + +#include + +#include +#include + +#include +#include + +//*************************************************************************** +// Definitions +//*************************************************************************** +// Configuration ************************************************************ + +// Debug ******************************************************************** +// Non-standard debug that may be enabled just for testing the constructors + +#ifndef CONFIG_DEBUG_FEATURES +# undef CONFIG_DEBUG_CXX +#endif + +#ifdef CONFIG_DEBUG_CXX +# define cxxinfo _info +#else +# define cxxinfo(x...) +#endif + +typedef etl::vector Data; + +//*************************************************************************** +// Private Classes +//*************************************************************************** + +class CETL +{ + public: + CETL(void) : mSecret(42) + { + cxxinfo("Constructor: mSecret=%d\n", mSecret); + } + + ~CETL(void) + { + cxxinfo("Destructor\n"); + } + + bool HelloWorld(void) + { + cxxinfo("HelloWorld: mSecret=%d\n", mSecret); + + // Declare the vector instances. + etl::vector v1(10); + etl::vector v2(20); + + etl::iota(v1.begin(), v1.end(), 0); // Fill with 0 through 9 + etl::iota(v2.begin(), v2.end(), 10); // Fill with 10 through 29 + + printf("v1 with 0 through 9\n"); + for (auto& it : v1) { + printf("%i ", it); + } + printf("\n"); + + printf("v2 with 10 through 29\n"); + for (auto& it : v2) { + printf("%i ", it); + } + printf("\n"); + + return true; + } + + private: + int mSecret; +}; + +//*************************************************************************** +// Private Data +//*************************************************************************** + +// Define a statically constructed CHellowWorld instance if C++ static +// initializers are supported by the platform + +#ifdef CONFIG_HAVE_CXXINITIALIZE +static CETL g_HelloWorld; +#endif + +//*************************************************************************** +// Public Functions +//*************************************************************************** + +/**************************************************************************** + * Name: etl_main + ****************************************************************************/ + + +extern "C" int main(int argc, FAR char *argv[]) +{ + // Exercise an explicitly instantiated C++ object + + CETL *pHelloWorld = new CETL; + printf("etl_main: Testing ETL from the dynamically constructed instance\n"); + pHelloWorld->HelloWorld(); + + // Exercise an C++ object instantiated on the stack + + CETL HelloWorld; + + printf("etl_main: Testing ETL from the instance constructed on the stack\n"); + HelloWorld.HelloWorld(); + + // Exercise an statically constructed C++ object + +#ifdef CONFIG_HAVE_CXXINITIALIZE + printf("etl_main: Testing ETL from the statically constructed instance\n"); + g_HelloWorld.HelloWorld(); +#endif + + delete pHelloWorld; + return 0; +}