Branch data Line data Source code
1 : : #include "FacetAttrib.hpp"
2 : : #include "CubitString.hpp"
3 : : #include "CubitSimpleAttrib.hpp"
4 : : #include "CubitFileIOWrapper.hpp"
5 : : #include "CubitMessage.hpp"
6 : : #include <algorithm>
7 : :
8 : : // Constructor - copy from CubitSimpleAttrib
9 : 1606 : FacetAttrib::FacetAttrib( const CubitSimpleAttrib& csa ) : listNext(0)
10 : : {
11 : : int i;
12 : :
13 : : // save counts
14 : 1606 : numStrings = csa.string_data_list().size();
15 : 1606 : numDoubles = csa.double_data_list().size();
16 : 1606 : numIntegers = csa.int_data_list().size();
17 : :
18 : : // allocate arrays, but don't try to allocate zero-length arrays
19 [ + - ][ + - ]: 3212 : stringArray = numStrings ? new CubitString[numStrings] : NULL;
[ + - ][ + + ]
[ # # ]
20 [ - + ][ # # ]: 1606 : doubleArray = numDoubles ? new double[numDoubles] : NULL;
21 [ + - ][ + - ]: 1606 : integerArray = numIntegers ? new int[numIntegers] : NULL;
22 : :
23 : : // copy data into arrays
24 [ + + ]: 3212 : for( i = 0; i < numStrings; i++ )
25 : 1606 : stringArray[i] = csa.string_data_list()[i];
26 [ + + ]: 6028 : for( i = 0; i < numIntegers; i++ )
27 : 4422 : integerArray[i] = csa.int_data_list()[i];
28 [ - + ]: 1606 : for( i = 0; i < numDoubles; i++ )
29 : 0 : doubleArray[i] = csa.double_data_list()[i];
30 [ # # ]: 1606 : }
31 : :
32 : : // Private constructor for use by restore(FILE*)
33 : 1012 : FacetAttrib::FacetAttrib( int string_count, CubitString strings[],
34 : : int double_count, double doubles[],
35 : : int int_count, int integers[] )
36 : : : stringArray(strings), doubleArray(doubles), integerArray(integers),
37 : : numStrings(string_count), numDoubles(double_count), numIntegers(int_count),
38 : 1012 : listNext(0)
39 : 1012 : {}
40 : :
41 : :
42 : : // Destructor -- free arrays
43 : 2618 : FacetAttrib::~FacetAttrib()
44 : : {
45 : : // "delete"ing NULL pointers is okay.
46 [ + - ]: 2618 : delete [] integerArray;
47 [ - + ]: 2618 : delete [] doubleArray;
48 [ + - ][ + + ]: 5236 : delete [] stringArray;
49 : 2618 : }
50 : :
51 : : // Copy this into a new CubitSimpleAttrib
52 : 1507 : CubitSimpleAttrib FacetAttrib::get_CSA() const
53 : : {
54 : : // Set initial list size
55 [ + - ][ + - ]: 1507 : std::vector<CubitString> string_list(numStrings);
[ + - ]
56 [ + - ][ + - ]: 3014 : std::vector<int> int_list(numIntegers);
57 [ + - ][ + - ]: 3014 : std::vector<double> double_list(numDoubles);
58 : :
59 : : // Don't need to 'new' objects in DLIList because
60 : : // CSA will make copies. Just put addresses in list.
61 : : int i;
62 [ + + ]: 3014 : for( i = 0; i < numStrings; i++ )
63 [ + - ][ + - ]: 1507 : string_list[i] = stringArray[i];
64 [ + + ]: 5929 : for( i = 0; i < numIntegers; i++ )
65 [ + - ]: 4422 : int_list[i] = integerArray[i];
66 [ - + ]: 1507 : for( i = 0; i < numDoubles; i++ )
67 [ # # ]: 0 : double_list[i] = doubleArray[i];
68 : :
69 [ + - ][ + - ]: 3014 : return CubitSimpleAttrib( &string_list, &double_list, &int_list );
70 : : }
71 : :
72 : : // compare to a CubitSimpleAttrib
73 : 3872 : bool FacetAttrib::equals( const CubitSimpleAttrib& csa ) const
74 : : {
75 : : // compare counts
76 [ + - ][ + + ]: 9559 : if( csa.int_data_list().size() != (size_t)numIntegers ||
77 [ + + ][ - + ]: 5687 : csa.double_data_list().size() != (size_t)numDoubles ||
78 : 1815 : csa.string_data_list().size() != (size_t)numStrings )
79 : 2057 : return false;
80 : :
81 : : // compare strings first because most likely the
82 : : // first string (the name) will differ.
83 [ + + ]: 1815 : if(!std::equal(stringArray, stringArray+numStrings, csa.string_data_list().begin()))
84 : 209 : return false;
85 [ - + ]: 1606 : if(!std::equal(doubleArray, doubleArray+numDoubles, csa.double_data_list().begin()))
86 : 0 : return false;
87 [ - + ]: 1606 : if(!std::equal(integerArray, integerArray+numIntegers, csa.int_data_list().begin()))
88 : 0 : return false;
89 : :
90 : 1606 : return true;
91 : : }
92 : :
93 : : // write to a file at the current file offset
94 : 1012 : CubitStatus FacetAttrib::save(FILE *save_file) const
95 : : {
96 [ - + ]: 1012 : if( save_file == NULL)
97 : : {
98 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving MBG attributes: null FILE ptr\n");
[ # # ][ # # ]
99 : 0 : return CUBIT_FAILURE;
100 : : }
101 : :
102 [ + - ]: 1012 : NCubitFile::CIOWrapper wrapper(save_file);
103 : :
104 : : // write a version number for the attribute data
105 : 1012 : unsigned int Attrib_Version = 1;
106 [ + - ]: 1012 : wrapper.Write(&Attrib_Version, 1);
107 : :
108 : : // write the number of strings, number of doubles, and number of integers
109 : 1012 : int counts[3] = { numStrings, numDoubles, numIntegers };
110 [ + - ]: 1012 : wrapper.Write(reinterpret_cast<unsigned int*>(counts), 3);
111 : :
112 : : // write the string data
113 : : int i;
114 [ + + ]: 2024 : for( i = 0; i < numStrings; i++ )
115 [ + - ][ + - ]: 1012 : wrapper.Write(stringArray[i].c_str());
116 : :
117 : : // write the doubles
118 [ + - ]: 1012 : wrapper.Write(doubleArray, numDoubles);
119 : :
120 : : // write the integers
121 [ + - ]: 1012 : wrapper.Write(reinterpret_cast<unsigned int*>(integerArray), numIntegers);
122 : :
123 [ + - ]: 1012 : return CUBIT_SUCCESS;
124 : : }
125 : :
126 : :
127 : : // read from file starting at current file offset
128 : 1012 : FacetAttrib* FacetAttrib::restore(FILE *restore_file, unsigned int endian)
129 : : {
130 [ - + ]: 1012 : if( restore_file == NULL )
131 : 0 : return NULL;
132 : :
133 [ + - ]: 1012 : NCubitFile::CIOWrapper wrapper(endian, restore_file );
134 : :
135 : : // write a version number for the attribute data
136 : : unsigned int version;
137 [ + - ]: 1012 : wrapper.Read(&version, 1);
138 : :
139 : : // haven't handled any version changes yet
140 [ - + ]: 1012 : if( version != 1 )
141 : : {
142 [ # # ][ # # ]: 0 : PRINT_ERROR("Wrong FacetAttrib version : %u\n", version );
[ # # ]
[ # # # # ]
143 : 0 : return NULL;
144 : : }
145 : :
146 : : // read the number of strings, number of doubles, and number of integers
147 : : int counts[3];
148 [ + - ]: 1012 : wrapper.Read(reinterpret_cast<unsigned int*>(counts), 3);
149 : 1012 : int n_strings = counts[0];
150 : 1012 : int n_doubles = counts[1];
151 : 1012 : int n_ints = counts[2];
152 : :
153 : : // allocate arrays, but don't try to allocate zero-length array
154 [ + - ][ + - ]: 2024 : CubitString* strings = n_strings ? new CubitString[n_strings] : NULL;
[ + - ][ + - ]
[ + + ][ # # ]
155 [ - + ][ # # ]: 1012 : double *doubles = n_doubles ? new double[n_doubles] : NULL;
[ # # ]
156 [ + - ][ + - ]: 1012 : int *ints = n_ints ? new int[n_ints] : NULL;
[ + - ]
157 : :
158 : : // read the string data
159 : : int i;
160 [ + + ]: 2024 : for( i = 0; i < n_strings; i++ )
161 : : {
162 [ + - ]: 1012 : char *string = wrapper.Read();
163 [ + - ][ + - ]: 1012 : strings[i] = CubitString(string);
[ + - ]
164 [ + - ]: 1012 : delete [] string;
165 : : }
166 : :
167 : : // write the doubles
168 [ + - ]: 1012 : wrapper.Read(doubles, n_doubles);
169 : :
170 : : // write the integers
171 [ + - ]: 1012 : wrapper.Read(reinterpret_cast<unsigned int*>(ints), n_ints);
172 : :
173 [ + - ][ + - ]: 1012 : return new FacetAttrib(n_strings, strings, n_doubles, doubles, n_ints, ints);
[ + - ]
174 : : }
175 : :
176 : :
|