1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: ArrayUserTypes.cxx
5
6 -------------------------------------------------------------------------
7 Copyright 2008 Sandia Corporation.
8 Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 the U.S. Government retains certain rights in this software.
10 -------------------------------------------------------------------------
11
12 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
13 All rights reserved.
14 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
15
16 This software is distributed WITHOUT ANY WARRANTY; without even
17 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
18 PURPOSE. See the above copyright notice for more information.
19
20 =========================================================================*/
21
22 #include <vtkDenseArray.h>
23 #include <vtkSmartPointer.h>
24 #include <vtkSparseArray.h>
25
26 #include <vtksys/ios/iostream>
27 #include <vtksys/ios/sstream>
28 #include <vtksys/stl/stdexcept>
29
30 #define test_expression(expression) \
31 { \
32 if(!(expression)) \
33 { \
34 vtksys_ios::ostringstream buffer; \
35 buffer << "Expression failed at line " << __LINE__ << ": " << #expression; \
36 throw std::runtime_error(buffer.str()); \
37 } \
38 }
39
40 class UserType
41 {
42 public:
UserType()43 UserType() :
44 Value("")
45 {
46 }
47
UserType(const vtkStdString & value)48 UserType(const vtkStdString& value) :
49 Value(value)
50 {
51 }
52
operator ==(const UserType & other) const53 bool operator==(const UserType& other) const
54 {
55 return this->Value == other.Value;
56 }
57
58 vtkStdString Value;
59 };
60
61 template<>
vtkVariantCast(const vtkVariant & value,bool * valid)62 inline UserType vtkVariantCast<UserType>(const vtkVariant& value, bool* valid)
63 {
64 if(valid)
65 *valid = true;
66 return UserType(value.ToString());
67 }
68
69 template<>
vtkVariantCreate(const UserType & value)70 inline vtkVariant vtkVariantCreate<UserType>(const UserType& value)
71 {
72 return vtkVariant(value.Value);
73 }
74
TestArrayUserTypes(int vtkNotUsed (argc),char * vtkNotUsed (argv)[])75 int TestArrayUserTypes(int vtkNotUsed(argc), char *vtkNotUsed(argv)[])
76 {
77 try
78 {
79 vtkSmartPointer<vtkDenseArray<UserType> > dense = vtkSmartPointer<vtkDenseArray<UserType> >::New();
80 dense->Resize(3, 4);
81 dense->Fill(UserType("red"));
82 for(vtkArray::SizeT n = 0; n != dense->GetNonNullSize(); ++n)
83 {
84 test_expression(dense->GetValueN(n) == UserType("red"));
85 }
86
87 dense->SetValue(1, 2, UserType("green"));
88 test_expression(dense->GetValue(1, 2) == UserType("green"));
89
90 dense->SetVariantValue(1, 2, vtkVariant("puce"));
91 test_expression(dense->GetValue(1, 2) == UserType("puce"));
92 test_expression(dense->GetVariantValue(1, 2) == vtkVariant("puce"));
93
94 vtkSmartPointer<vtkSparseArray<UserType> > sparse = vtkSmartPointer<vtkSparseArray<UserType> >::New();
95 sparse->Resize(3, 4);
96 sparse->SetNullValue(UserType("blue"));
97 test_expression(sparse->GetNullValue() == UserType("blue"));
98 test_expression(sparse->GetValue(1, 2) == UserType("blue"));
99
100 sparse->SetValue(0, 1, UserType("white"));
101 test_expression(sparse->GetValue(0, 1) == UserType("white"));
102
103 sparse->AddValue(2, 3, UserType("yellow"));
104 test_expression(sparse->GetValue(2, 3) == UserType("yellow"));
105
106 sparse->SetVariantValue(2, 3, vtkVariant("slate"));
107 test_expression(sparse->GetValue(2, 3) == UserType("slate"));
108 test_expression(sparse->GetVariantValue(2, 3) == vtkVariant("slate"));
109
110 return 0;
111 }
112 catch(std::exception& e)
113 {
114 cerr << e.what() << endl;
115 return 1;
116 }
117 }
118