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