This is an automated email from the ASF dual-hosted git repository.
bbender pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git
The following commit(s) were added to refs/heads/develop by this push:
new 6c1cf0c Updates README.md, CONTRIBUTING.md and BUILDING.md (#755)
6c1cf0c is described below
commit 6c1cf0c9c5de4bad6733d2e0e9fa850a56d33393
Author: Jacob Barrett <[email protected]>
AuthorDate: Tue Mar 2 10:41:18 2021 -0800
Updates README.md, CONTRIBUTING.md and BUILDING.md (#755)
* Updates README.md with established versioning rules.
* Updates CONTRIBUTING.md and BUILDING.md.
* Updates OS versions
* updates tooling
* Moves contributing details from BUILDING.md to CONTRIBUTING.md
---
BUILDING.md | 113 ++++-------------
CONTRIBUTING.md | 376 ++++++++++++++++++++++++++++++++++----------------------
README.md | 52 +++++---
3 files changed, 294 insertions(+), 247 deletions(-)
diff --git a/BUILDING.md b/BUILDING.md
index 63aabd3..6536b41 100644
--- a/BUILDING.md
+++ b/BUILDING.md
@@ -2,7 +2,7 @@
## Prerequisites (All Platforms)
-* [CMake 3.12](https://cmake.org/) or newer
+* [CMake 3.18](https://cmake.org/) or newer
* C++11 compiler *(see platform specific requirements)*
* [Doxygen 1.8.11 or greater](https://sourceforge.net/projects/doxygen/) *(for
building source documentation)*
* [OpenSSL](https://www.openssl.org) *(for building source documentation)*
@@ -72,7 +72,7 @@ Install XCode from the App Store
Install the required dependencies through homebrew. If you use another package
manager for your mac feel free to use
that.
-```bash
+```console
$ brew install geode
$ brew install openssl
$ brew install doxygen
@@ -82,7 +82,7 @@ $ brew install cmake
You will need to provide the path to the brew installed OpenSSL headers since
macOS already has a system installed
version but without the required headers.
-```bash
+```console
$ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
```
@@ -130,73 +130,6 @@ IPv6 support can be enabled by adding `-DWITH_IPV6=ON` to
the CMake [Generator](
$ cmake … -DWITH_IPV6=ON …
```
-#### Code Coverage
-
-If building with GCC or Clang you can enable C++ code coverage by adding
`-DUSE_CPP_COVERAGE=ON` to the
-CMake [Generator](#generator) command.
-
-```console
-$ cmake … -DUSE_CPP_COVERAGE=ON …
-```
-
-You can then generate a C++ code coverage report by downloading
[lcov](http://ltp.sourceforge.net/coverage/lcov.php).
-After acquiring lcov, finish the [Steps to build](#Steps-to-build) section
above. Then, run the tests as described in
-the [CONTRIBUTING.md](CONTRIBUTING.md). Finally, run the following commands
from the `build` directory:
-
-```console
-$ lcov --capture --directory . --output-file coverage.info
-$ genhtml coverage.info --output-directory coverage_report
-```
-
-You can then open the `index.html` file in the `coverage_report` directory
using any browser.
-
-#### Clang-Tidy
-
-To enable `clang-tidy`:
-
-```console
-$ cmake … -DCMAKE_CXX_CLANG_TIDY=clang-tidy …
-```
-
-To use specific `clang-tidy`:
-
-```console
-$ cmake … -DCMAKE_CXX_CLANG_TIDY=/path/to/clang-tidy …
-```
-
-By default `clang-tidy` uses the configuration found in `.clang-tidy`
-To override `clang-tidy` options:
-
-```console
-$ cmake … -DCMAKE_CXX_CLANG_TIDY=clang-tidy;<options> …
-```
-
-#### Clang-format
-
-Individual targets in the build tree have their own dependency of the form
`<<targetName>>-clangformat`, which uses
-the `clang-format` executable, wherever it is found, to format and modified
files according to the rules specfied in the
-.clang-format file. This is helpful when submitting changes to geode-native,
because an improperly formatted file will
-fail Travis-CI and have to be fixed prior to merging any pull request. If
clang-format is not installed on your system,
-clangformat targets will not be added to your project files, and geode-native
should build normally. Under some
-circumstances, however, it may become necessary to disable `clang-format` on a
system where it _is_ installed.
-
-To disable `clang-format` in the build:
-
-```
-$ cmake … -DClangFormat_EXECUTABLE='' …
-```
-
-On the other hand, it may also be desirable to run clang-format on the entire
source tree. This is also easily done via
-the `all-clangformat` _in a build with clang-format enabled_. If clang-format
has been disabled in the cmake
-configuration step, as above, the `all-clangformat` target will not exist, and
the cmake configuration step will have to
-be re-run with clang-format enabled.
-
-To run clang-format on the entire source tree:
-
-```
-$ cmake --build . --target all-clangformat
-```
-
## Installing
By default a system-specific location is used by CMake as the destination of
the `install` target, e.g., `/usr/local` on
@@ -218,27 +151,27 @@ $ cmake --build . --target install
# Platform-Specific Prerequisites
-## <a id="windows"></a>Windows
+## Windows
-* Windows 8.1 64-bit
* Windows 10 64-bit
-* Windows Server 2012 R2 64-bit
* Windows Server 2016 64-bit
-* NUnit 2.6.4 (to run clicache tests)
+* Windows Server 2019 64-bit
### Required Tools
-* [Visual Studio 2015](https://www.visualstudio.com) or newer
-* .NET 4.5.2 or later
-* Chocolatey
-* [Other dependencies installed via
Powershell](packer/windows/install-dependencies.ps1)
+* [Visual Studio](https://www.visualstudio.com) 2017 or newer
+* [.NET](https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet-framework)
4.5.2 or later
+* Other dependencies installed by
[Packer](packer/build-windows-2016-vs-2017.json) scripts
-## <a id="linux"></a>Linux
+## Linux
-* RHEL/CentOS 6
* RHEL/CentOS 7
-* SLES 11
-* SLES 12
+* RHEL/CentOS 8
+* Ubuntu 2016.04 (Xenial)
+* Ubuntu 2018.04 (Bionic)
+* Ubuntu 2020.04 (Focal)
+
+Other distributions and versions may be supported given C++11 compatible
compiler and runtime library.
### Required Tools
@@ -246,13 +179,15 @@ $ cmake --build . --target install
### Optional Tools
-* [Eclipse CDT 8.8](https://eclipse.org/cdt/) or newer
+* [CLion](https://www.jetbrains.com/clion/)
-## <a id="mac-os-x"></a>Mac OS X
+## macOS
-* Mac OS X 10.12 (Sierra) or newer
-* Xcode 8.2 or newer
+* macOS X 10.15 (Catalina) or newer
+* Xcode 11 or newer
+Older versions of macOS or Mac OS X and Xcode may work but are not regularly
tested or developed on.
+
### Required Tools
* [Xcode](https://developer.apple.com/xcode/download/)
@@ -268,11 +203,13 @@ $ xcode-select --install
* [Doxygen GUI](http://ftp.stack.nl/pub/users/dimitri/Doxygen-1.8.11.dmg)
* [CLion](https://www.jetbrains.com/clion/)
-## <a id="solaris"></a>Solaris
-
+## Solaris
* Solaris 11 SPARC
* Solaris 11 x86
+Solaris is not actively developed or tested. While no effort has been made to
remove Solaris support it is likely
+broken.
+
### Required Tools
* [Solaris Studio
12.6](http://www.oracle.com/technetwork/server-storage/developerstudio/downloads/index.html)
or newer
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ac090d4..52bd8e9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,192 +6,278 @@ see [BUILDING.md](BUILDING.md)
## Next steps
* Make your changes/add your feature/fix a bug.
-* Test your feature branch changes.
-* Check your formatting.
+* Conform to established [versioning requirements](README.md#versioning).
+* [Test](#testing) your feature branch changes.
+* Check your [formatting](#clang-format) and [style](#clang-tidy).
* Submit a pull request.
## Testing
-Before submitting a pull request all tests must pass. This includes all unit
tests, integration tests, and acceptance tests. We are using CTest for running
tests (please see [the CTest
documentation](https://cmake.org/Wiki/CMake/Testing_With_CTest) for further
information) and [Google Test](https://github.com/google/googletest) as testing
framework.
+Before submitting a pull request all tests must pass. This includes all unit
tests, integration tests, and acceptance
+tests. We are using CTest for running tests (please see [the CTest
documentation](https://cmake.org/Wiki/CMake/Testing_With_CTest)
+for further information) and [Google
Test](https://github.com/google/googletest) as testing framework.
### Running unit tests
-```bash
-$ cd <clone>
-$ cd build
-$ cd cppcache/test/<Debug|Release|if needed>
+```console
+$ cd build/cppcache/test/<Debug|Release|if needed>
$ ./apache-geode_unittests
```
### Running integration tests
-There are two test suites of integration tests based on different testing
frameworks. The old integration tests (stored in
`geode-native/cppcache/integration-test`) are based on a custom testing
framework, and the newer ones (stored in
`geode-native/cppcache/integration/test`) are based on [Google
Test](https://github.com/google/googletest).
+There are two test suites of integration tests based on different testing
frameworks. The old integration tests (stored
+in `geode-native/cppcache/integration-test`) are based on a custom testing
framework, and the newer ones (stored in
+`geode-native/cppcache/integration/test`) are based on [Google
Test](https://github.com/google/googletest).
-Old integration tests are deprecated. If your changes include the
implementation of new integration test/s to be verified, they should be written
using Google Test. If your change implies a significant change in one or more
old test cases, you should create the equivalent test case/s using Google Test
to substitute the old one/s instead of adapting them.
+Old integration tests are deprecated. If your changes include the
implementation of new integration test/s to be
+verified, they should be written using Google Test. If your change implies a
significant change in one or more old test
+cases, you should create the equivalent test case/s using Google Test to
substitute the old one/s instead of adapting
+them.
-Both integration test suites can be executed together using CTest.
+Both integration test suites can be executed using CTest.
-#### Running old integration test suite
-```bash
+#### Running heritage integration test suite
+```console
$ cd build/cppcache/integration-test
-$ ctest --timeout 2000 -L STABLE -C <Debug|Release> -j1
+$ ctest -C <Debug|RelWithDebInfo> --timeout 300 -j1
```
-Execution will take 2 hours approximately. It is possible to increase the
number of jobs changing the value of `-j` parameter (up to `4`) for running
tests in parallel, although it may end up with failed tests that will need to
be re-run sequentially. Standalone tests can also be run as follows:
+Execution will take 2 hours approximately. It is possible to increase the
number of jobs changing the value of `-j`
+parameter (up to `4`) for running tests in parallel, although it may end up
with failed tests that will need to be
+re-run sequentially.
-```bash
+Standalone tests can also be run as follows:
+```console
$ cd build/cppcache/integration-test
-$ ctest -R <test_name> -C <Debug|Release>
+$ ctest -C <Debug|RelWithDebInfo> -R <test_name>
+```
+For example:
+```console
+$ ctest -C RelWithDebInfo -R testCacheless
```
-For example: `$ ctest --timeout 2000 -L STABLE -C Release -R testCacheless -j1`
.NET integration tests can be executed similarly from
`build/clicache/integration-test`.
-#### Running Google Test integration test suite
+#### Running new Google Test integration test suite
Make sure Docker is installed as it is required for SNI Tests
-```bash
-$ cd <clone>
+```console
$ cd build/cppcache/integration/test
-$ ctest -j1
+$ ctest -C <Debug|RelWithDebInfo> -j1
```
-It is possible to increase the number of jobs changing the value of `-j`
parameter for running tests in parallel, although it may end up with failed
tests that will need to be re-run sequentially. Standalone tests can also be
run as follows:
-```bash
-$ cd <clone>
+It is possible to increase the number of jobs changing the value of `-j`
parameter for running tests in parallel,
+although it may end up with failed tests that will need to be re-run
sequentially. Standalone tests can also be run as
+follows:
+```console
$ cd build/cppcache/integration/test
-$ ctest -R <test_name> -j1
+$ ctest -C <Debug|RelWithDebInfo> -R <test_name> -j1
+```
+For example:
+```console
+$ ctest -C RelWithDebInfo -R AuthInitializeTest.putGetWithBasicAuth -j1
```
-For example: `$ ctest -R AuthInitializeTest.putGetWithBasicAuth -j1`
-Notice that `BasicIPv6Test` test is expected to fail due to IPv6 support is
disabled by default. [BUILDING.md](BUILDING.md) explains how to enable it.
+Notice that `BasicIPv6Test` test is expected to fail due to IPv6 support is
disabled by default. [BUILDING.md](BUILDING.md)
+explains how to enable it.
### Running acceptance tests
-Acceptance tests is a new category of tests that are designed to test end to
end connectivity of a geode-native client with a cloud based geode cluster that
sits behind a proxy server.
+Acceptance tests is a new category of tests that are designed to test end to
end connectivity of a geode-native client
+with a cloud based geode cluster that sits behind a proxy server.
-These tests are stored in `geode-native/cppcache/acceptance-test` and
`geode-native/clicache/acceptance-test` for C++ and .NET clients respectively.
They utilize docker containers for the proxy server and geode servers. They are
enabled during cmake configuration only if docker and docker-compose are found.
+These tests are stored in `geode-native/cppcache/acceptance-test` and
`geode-native/clicache/acceptance-test` for C++
+and .NET clients respectively. They utilize docker containers for the proxy
server and geode servers. They are enabled
+during cmake configuration only if docker and docker-compose are found.
-The acceptance tests can be run using ctest as follows. Note: Currently, the
tests can only be run sequentially, hence the -j1 flag below.
+The acceptance tests can be run using ctest as follows. Note: Currently, the
tests can only be run sequentially, hence
+the -j1 flag below.
For C++ clients:
-```bash
-$ cd <clone>
+```console
$ cd build/cppcache/acceptance-test
-$ ctest -R <test_name> -j1
+$ ctest -C <Debug|RelWithDebInfo> -R <test_name> -j1
```
For .NET clients:
-```bash
-$ cd <clone>
+```console
$ cd build/clicache/acceptance-test
-$ ctest -R <test_name> -j1
+$ ctest -C <Debug|RelWithDebInfo> -R <test_name> -j1
```
## Style
### Formatting C++
-For C++ it is required to follow the [Google C++ Style
Guide](https://google.github.io/styleguide/cppguide.html) and have a build
target that uses [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
to achieve compliance.
-```bash
-$ clang-format -i --style=file <PATH_TO_FILES>
+For C++ it is required to follow the [Google C++ Style
Guide](https://google.github.io/styleguide/cppguide.html) and
+have a build target that uses
[clang-format](https://clang.llvm.org/docs/ClangFormat.html) to achieve
compliance.
+
+#### Clang-format
+
+Individual targets in the build tree have their own dependency of the form
`<<targetName>>-clangformat`, which uses
+the `clang-format` executable, wherever it is found, to format and modified
files according to the rules specfied in the
+.clang-format file. This is helpful when submitting changes to geode-native,
because an improperly formatted file will
+fail Travis-CI and have to be fixed prior to merging any pull request. If
clang-format is not installed on your system,
+clangformat targets will not be added to your project files, and geode-native
should build normally. Under some
+circumstances, however, it may become necessary to disable `clang-format` on a
system where it _is_ installed. The
+clang-format rules are defined in the `.clang-format` files.
+
+To enable `clang-tidy` if CMake does not find `clang-format`:
+
+```console
+$ cmake … -DClangFormat_EXECUTABLE=/path/to/clang-format …
+```
+
+To disable `clang-format` in the build:
+
+```console
+$ cmake … -DClangFormat_EXECUTABLE='' …
+```
+
+On the other hand, it may also be desirable to run clang-format on the entire
source tree. This is also easily done via
+the `all-clangformat` _in a build with clang-format enabled_. If clang-format
has been disabled in the cmake
+configuration step, as above, the `all-clangformat` target will not exist, and
the cmake configuration step will have to
+be re-run with clang-format enabled.
+
+To run clang-format on the entire source tree:
+
+```console
+$ cmake --build . --target all-clangformat
+```
+
+#### Clang-Tidy
+
+Code style and conventions are enforced with clang-tidy. The clang-tidy rules
can be found in the `.clang-tidy` files.
+
+To enable `clang-tidy`:
+
+```console
+$ cmake … -DCMAKE_CXX_CLANG_TIDY=/path/to/clang-tidy …
+```
+
+### Code Cleanup
+When editing old code please make the following changes.
+
+* Prefer the use of [`auto`](http://en.cppreference.com/w/cpp/language/auto)
C++ or
[`var`](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/var)
+ in C# where applicable.
+ ```c++
+ std::vector<Cars> cars = lot.getCars();
+ ```
+ should be changed to
+ ```c++
+ auto cars = lot.getCars();
+ ```
+
+* Prefer [range for](http://en.cppreference.com/w/cpp/language/range-for)
loops over traditional for loops where
+ applicable.
+ ```c++
+ for (std::vector<Car>::iterator i = cars.begin(); i != cars.end(), ++i) {
+ Car car = *i;
+ std::cout << car.getName();
+ }
+ ```
+ should be changed to
+ ```c++
+ for (const auto& car : cars) {
+ std::cout << car.getName();
+ }
+ ```
+
+* Fix bad variable names. Variable names should be expressive.
+ ```c++
+ double i = car.getFuelLevel();
+ ```
+ should be changed to
+ ```c++
+ auto fuelLevel = car.getFuelLevel();
+ ```
+
+* Use [`override`](http://en.cppreference.com/w/cpp/language/override) on all
method overrides.
+
+ Given a base class
+ ```c++
+ class Base {
+ public:
+ Base();
+ virtual ~Base();
+ virtual virtualMethod();
+ virtual pureVirtualMethod() = 0;
+ }
+ ```
+ the derived class
+ ```c++
+ class Derived : public Base {
+ public:
+ virtual ~Derived();
+ virtual virtualMethod();
+ virtual pureVirtualMethod();
+ }
+ ```
+ should be changed to
+ ```c++
+ class Derived : public Base {
+ public:
+ Derived();
+ ~Derived() override;
+ virtualMethod() override;
+ pureVirtualMethod() override;
+ }
+ ```
+
+* Fix
[`std::string::c_str()`](http://en.cppreference.com/w/cpp/string/basic_string/c_str)
calls where passed to
+ [`std::string`](http://en.cppreference.com/w/cpp/string/basic_string)
parameters.
+ ```c++
+ auto name = std::string("Delorean");
+ ...
+ car.setName(name.c_str());
+ ```
+ should be changed to
+ ```c++
+ auto name = std::string("Delorean");
+ ...
+ car.setName(name);
+ ```
+
+* Replace [`sprintf`](http://en.cppreference.com/w/cpp/io/c/fprintf) for
logging messages with
[`std::string`](http://en.cppreference.com/w/cpp/string/basic_string)
+ or
[`std::stringstream`](http://en.cppreference.com/w/cpp/io/basic_stringstream).
+ ```c++
+ char[1024] buffer;
+ sprintf(buffer, "Car::crashed: name=%s", car.getName().c_str());
+ LOG(buffer);
+ ```
+ should be changed to
+ ```c++
+ LOG("Car::crashed: name=" + car.getName());
+ ```
+
+* Replace
[`dynamic_cast`](http://en.cppreference.com/w/cpp/language/dynamic_cast) on
[`std::shared_ptr`](http://en.cppreference.com/w/cpp/memory/shared_ptr)
+ with
[`std::dynamic_pointer_cast`](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast).
Same goes for
+ [`static_cast`](http://en.cppreference.com/w/cpp/language/static_cast) to
[`std::static_pointer_cast`](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast),
+ etc.
+ ```c++
+ std::shared_ptr<Car> car = garage.getCar();
+ Delorean* delorean = dynamic_cast<Delorean*>(car.get());
+ if (nullptr != delorean) {
+ delorean->setSpeed(88);
+ }
+ ```
+ should be changed to
+ ```c++
+ auto car = garage.getCar();
+ if (auto delorean = std::dynamic_pointer_cast<Delorean>(car)) {
+ delorean->setSpeed(88);
+ }
+ ```
+
+## Code Coverage
+
+If building with GCC or Clang you can enable C++ code coverage by adding
`-DUSE_CPP_COVERAGE=ON` to the CMake generator
+command.
+
+```console
+$ cmake .. -DUSE_CPP_COVERAGE=ON …
+```
+
+You can then generate a C++ code coverage report by downloading
[lcov](http://ltp.sourceforge.net/coverage/lcov.php).
+After acquiring lcov, finish the [Steps to build](BUILDING.md#Steps-to-build)
section above. Then, run the tests as
+described in the this document. Finally, run the following commands from the
`build` directory:
+
+```console
+$ lcov --capture --directory . --output-file coverage.info
+$ genhtml coverage.info --output-directory coverage_report
```
-### Code
-When writing new or refactoring old code please make the following changes.
-
- * Prefer the use of [`auto`](http://en.cppreference.com/w/cpp/language/auto)
C++ or
[`var`](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/var)
in C# where applicable.
- ```c++
- std::vector<Cars> cars = lot.getCars();
- ```
- should be changed to
- ```c++
- auto cars = lot.getCars();
- ```
-
- * Prefer [range for](http://en.cppreference.com/w/cpp/language/range-for)
loops over traditional for loops where applicable.
- ```c++
- for (std::vector<Car>::iterator i = cars.begin(); i != cars.end(), ++i) {
- Car car = *i;
- std::cout << car.getName();
- }
- ```
- should be changed to
- ```c++
- for (const auto& car : cars) {
- std::cout << car.getName();
- }
- ```
-
- * Fix bad variable names. Variable names should be expressive.
- ```c++
- double i = car.getFuelLevel();
- ```
- should be changed to
- ```c++
- auto fuelLevel = car.getFuelLevel();
- ```
-
- * Use [`override`](http://en.cppreference.com/w/cpp/language/override) on
all method overrides.
-
- Given a base class
- ```c++
- class Base {
- public:
- Base();
- virtual ~Base();
- virtual virtualMethod();
- virtual pureVirtualMethod() = 0;
- }
- ```
- the derived class
- ```c++
- class Derived : public Base {
- public:
- virtual ~Derived();
- virtual virtualMethod();
- virtual pureVirtualMethod();
- }
- ```
- should be changed to
- ```c++
- class Derived : public Base {
- public:
- Derived();
- ~Derived() override;
- virtualMethod() override;
- pureVirtualMethod() override;
- }
- ```
-
- * Fix
[`std::string::c_str()`](http://en.cppreference.com/w/cpp/string/basic_string/c_str)
calls where passed to
[`std::string`](http://en.cppreference.com/w/cpp/string/basic_string)
parameters.
- ```c++
- auto name = std::string("Delorean");
- ...
- car.setName(name.c_str());
- ```
- should be changed to
- ```c++
- auto name = std::string("Delorean");
- ...
- car.setName(name);
- ```
-
- * Replace [`sprintf`](http://en.cppreference.com/w/cpp/io/c/fprintf) for
logging messages with
[`std::string`](http://en.cppreference.com/w/cpp/string/basic_string) or
[`std::stringstream`](http://en.cppreference.com/w/cpp/io/basic_stringstream).
- ```c++
- char[1024] buffer;
- sprintf(buffer, "Car::crashed: name=%s", car.getName().c_str());
- LOG(buffer);
- ```
- should be changed to
- ```c++
- LOG("Car::crashed: name=" + car.getName());
- ```
-
- * Replace
[`dynamic_cast`](http://en.cppreference.com/w/cpp/language/dynamic_cast) on
[`std::shared_ptr`](http://en.cppreference.com/w/cpp/memory/shared_ptr) with
[`std::dynamic_pointer_cast`](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast).
Same goes for
[`static_cast`](http://en.cppreference.com/w/cpp/language/static_cast) to
[`std::static_pointer_cast`](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast),
etc.
- ```c++
- std::shared_ptr<Car> car = garage.getCar();
- Delorean* delorean = dynamic_cast<Delorean*>(car.get());
- if (nullptr != delorean) {
- delorean->setSpeed(88);
- }
- ```
- should be changed to
- ```c++
- auto car = garage.getCar();
- if (auto delorean = std::dynamic_pointer_cast<Delorean>(car)) {
- delorean->setSpeed(88);
- }
- ```
+You can then open the `index.html` file in the `coverage_report` directory
using any browser.
diff --git a/README.md b/README.md
index f333bef..741c23f 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,53 @@
-[<img src="https://geode.apache.org/img/Apache_Geode_logo.png"
align="center"/>](http://geode.apache.org)
+[](http://geode.apache.org)
-[](https://travis-ci.org/apache/geode-native)
[](https://www.apache.org/licenses/LICENSE-2.0)
[](https://lgtm.com/projects/g/apache/geode-native/alerts/)
[](https://concourse.apachegeode-ci.info/teams/main/pipelines/geode-native-develop)
+[](https://www.apache.org/licenses/LICENSE-2.0)
+[](https://lgtm.com/projects/g/apache/geode-native/alerts/)
+[](https://lgtm.com/projects/g/apache/geode-native/context:cpp)
+[](https://lgtm.com/projects/g/apache/geode-native/context:csharp)
+[](https://lgtm.com/projects/g/apache/geode-native/context:javascript)
-**[Overview](#overview)**
-**[Building from Source](#building)**
-**[Application Development](#development)**
+Table of Contents
+=================
+* [Overview](#overview)
+* [Building from Source](#building-from-source)
+* [Application Development](#application-development)
+* [Versioning](#versioning)
+* [Export Control](#export-control)
-## <a name="overview"></a>Overview
+# Overview
-Native Client is a client implementation for [Apache
Geode](http://geode.apache.org/) that does not require the Java server JARs.
+Native Client is a client implementation for [Apache
Geode](http://geode.apache.org/) that does not require the Java
+server JARs.
-## <a name="building"></a>Building from Source
+# Building from Source
Directions to build Native Client from source can be found in the source
distribution in [BUILDING.md](BUILDING.md).
-## <a name="development"></a>Application Development
+# Application Development
Native Client applications can be written in these client technologies:
-* [C++] (https://isocpp.org)
-* [C#] (https://msdn.microsoft.com/en-us/library/ms228593.aspx)
+* [C++](https://isocpp.org)
+* [.NET
Framework](https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet-framework)
-## Export Control
+# Versioning
+
+Geode Native follows the [Semantic Versioning
2.0.0](https://semver.org/spec/v2.0.0.html) specification (semver). This
+specification only addresses the [API](https://en.wikipedia.org/wiki/API)
compatibility with libraries and does not
+cover [ABI](https://en.wikipedia.org/wiki/Application_binary_interface)
compatibility.
+
+## C++
+
+ABI compatibility is not preserved similarly to the API compatibility. ABI
compatibility is only guaranteed between
+patch releases. Recompilation is required for both minor and major releases.
+
+## .NET
+
+ABI compatibility is preserved similarly to the API compatibility. ABI
compatibility is guaranteed between patch and
+minor releases. Recompilation is only require for major releases or to utilize
new APIs added in minor releases.
+
+# Export Control
This distribution includes cryptographic software.
The country in which you currently reside may have restrictions
@@ -45,5 +71,3 @@ for both object code and source code.
The following provides more details on the included cryptographic software:
* Apache Geode links to and uses [OpenSSL](https://www.openssl.org/) ciphers.
-
-