File: TestInformationDataObjectKey.cxx

package info (click to toggle)
vtk9 9.3.0%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 267,116 kB
  • sloc: cpp: 2,195,914; ansic: 285,452; python: 104,858; sh: 4,061; yacc: 4,035; java: 3,977; xml: 2,771; perl: 2,189; lex: 1,762; objc: 153; makefile: 150; javascript: 90; tcl: 59
file content (96 lines) | stat: -rw-r--r-- 3,033 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause

#include "vtkInformation.h"
#include "vtkInformationDataObjectKey.h"
#include "vtkPolyData.h"

//----------------------------------------------------------------
// The vtkInformationDataObjectKey uses reinterpret_cast to cast between
// vtkDataObject* and vtkObjectBase*, instead of using static_cast.  See
// the comments in vtkInformationDataObjectKey.cxx for the reasons.
// In this test, we do compile-time and run-time checks to ensure that
// reinterpret_cast does not give the wrong answer.

//----------------------------------------------------------------
// First, some compile-time checks via static_assert, but use conversion
// to void pointer as a surrogate for reinterpret_cast since the latter
// cannot be used in a static_assert.

namespace
{

// This will be used to test static casts with multiple inheritance
struct OtherBase
{
  double x{ 0.0 };
};

// create our own data object type for testing
class TestClass
  : public vtkDataObject
  , public OtherBase
{
public:
  // public constructor, destructor to allow static allocation
  TestClass() = default;
  ~TestClass() override { ReferenceCount = 0; }
};

// a static instantiation for static testing
TestClass inst;

// pointers where C++ knows the object type
constexpr vtkDataObject* inst_dp = &inst;
constexpr vtkObjectBase* inst_bp = &inst;
constexpr OtherBase* inst_op = &inst;
// these hold the address without knowing the object type
constexpr void* inst_void_dp = inst_dp;
constexpr void* inst_void_bp = inst_bp;
constexpr void* inst_void_op = inst_op;

// well defined, will always succeed
static_assert(inst_bp == inst_dp, "Simple typed pointer comparison failed");

// undefined by C++ standard, but expected to be equal
static_assert(inst_void_bp == inst_void_dp, "Single-inherited base address mismatch");

// undefined by C++ standard, but expected to be different
static_assert(inst_void_bp != inst_void_op, "Multi-inherited base addresses match");

} // anonymous namespace

//----------------------------------------------------------------
// The run-time tests
int TestStoreDataObject()
{
  int rval = 0;

  // test storing data object in vtkInformation and then retrieving
  vtkNew<vtkInformation> information;
  vtkNew<vtkPolyData> polydata;

  information->Set(vtkDataObject::DATA_OBJECT(), polydata);
  vtkDataObject* data = information->Get(vtkDataObject::DATA_OBJECT());

  if (data != polydata)
  {
    std::cerr << "Error: Failed to store polydata in vtkInformation" << std::endl;
    rval = 1;
  }

  // vtkInformationDataObjectKey requires these two casts to equivalent
  if (reinterpret_cast<vtkObjectBase*>(data) != static_cast<vtkObjectBase*>(data))
  {
    std::cerr << "Error: Object address changed by static_cast<vtkObjectBase*>(vtkDataObject*)"
              << std::endl;
    rval = 1;
  }

  return rval;
}

int TestInformationDataObjectKey(int, char*[])
{
  return TestStoreDataObject();
}