CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
compare.h
1
2#ifndef _aspose_system_test_tools_compare_h_
3#define _aspose_system_test_tools_compare_h_
4
5#include "system/array.h"
6#include "system/collections/list.h"
7#include "system/collections/dictionary.h"
8#include "system/collections/hashset.h"
9#include "system/collections/queue.h"
10#include "system/collections/stack.h"
11#include "system/collections/sorted_dictionary.h"
12#include "system/collections/sorted_list.h"
13#include "system/collections/bitarray.h"
14#include "system/collections/ienumerable.h"
15#include "system/collections/specialized/string_collection.h"
16
17#include <system/boxed_value.h>
18
19#include <system/date_time.h>
20#include <system/timespan.h>
21#include <system/decimal.h>
22#include <system/guid.h>
23
24#include <algorithm>
25
27
28namespace System {
29
32{
33 // Array
40 template <typename T, typename U>
41 static bool AreEqual(const SharedPtr<Array<T>>& arrA, const SharedPtr<Array<U>>& arrB)
42 {
43 return AreEqualData(arrA, arrB);
44 }
51 template <typename T, typename U>
52 static bool AreEqual(const SharedPtr<Array<SharedPtr<T>>>& arrA,
53 const SharedPtr<Array<SharedPtr<U>>>& arrB)
54 {
55 if ((void*)arrA.GetObjectOrNull() == (void*)arrB.GetObjectOrNull())
56 return true;
57
58 if (!arrA || !arrB)
59 return false;
60
61 return AreEqualContainerOfObjects(arrA->data(), arrB->data());
62 }
63
64 // List
71 template <typename T, typename U>
72 static bool AreEqual(const SharedPtr< SCG::List<T> >& listA, const SharedPtr< SCG::List<U> >& listB)
73 {
74 return AreEqualData(listA, listB);
75 }
82 template <typename T, typename U>
83 static bool AreEqual(const SharedPtr< SCG::List< SharedPtr<T> > >& listA,
84 const SharedPtr< SCG::List< SharedPtr<U> > >& listB)
85 {
86 if ((void*)listA.GetObjectOrNull() == (void*)listB.GetObjectOrNull())
87 return true;
88
89 if (!listA || !listB)
90 return false;
91
92 return AreEqualContainerOfObjects(listA->data(), listB->data());
93 }
94
95 // List with Array
102 template <typename T, typename U>
103 static bool AreEqual(const SharedPtr< SCG::List<T> >& listA, const System::ArrayPtr<U>& arrB)
104 {
105 return AreEqualData(listA, arrB);
106 }
113 template <typename T, typename U>
114 static bool AreEqual(const System::ArrayPtr<T>& arrA, const SharedPtr< SCG::List<U> >& listB)
115 {
116 return AreEqualData(arrA, listB);
117 }
124 template <typename T, typename U>
125 static bool AreEqual(const System::ArrayPtr< SharedPtr<T> >& arr,
126 const SharedPtr< SCG::List< SharedPtr<U> > >& list)
127 {
128 if ((void*)arr.GetObjectOrNull() == (void*)list.GetObjectOrNull())
129 return true;
130
131 if (!arr || !list)
132 return false;
133
134 return AreEqualContainerOfObjects(arr->data(), list->data());
135 }
142 template <typename T, typename U>
143 static bool AreEqual(const SharedPtr< SCG::List< SharedPtr<T> > >& list,
144 const System::ArrayPtr< SharedPtr<U> >& arr)
145 {
146 if ((void*)list.GetObjectOrNull() == (void*)arr.GetObjectOrNull())
147 return true;
148
149 if (!list || !arr)
150 return false;
151
152 return AreEqualContainerOfObjects(list->data(), arr->data());
153 }
154
155 // Ditionary
162 template <typename K, typename U>
163 static bool AreEqual(const SharedPtr< SCG::Dictionary<K, U> >& dictA, const SharedPtr< SCG::Dictionary<K, U> >& dictB)
164 {
165 return AreEqualData(dictA, dictB);
166 }
173 template <typename K, typename U>
174 static bool AreEqual(const SharedPtr< SCG::Dictionary<K, SharedPtr<U> > >& dictA,
175 const SharedPtr< SCG::Dictionary<K, SharedPtr<U> > >& dictB)
176 {
177 if ((void*)dictA.GetObjectOrNull() == (void*)dictB.GetObjectOrNull())
178 return true;
179
180 if (!dictA || !dictB)
181 return false;
182
183 return AreEqualMapOfObjects(dictA->data(), dictB->data());
184 }
193 template <typename K1, typename U1, typename K2, typename U2>
194 static bool AreEqual(const SharedPtr< SCG::Dictionary<K1, U1> >& dictA, const SharedPtr< SCG::Dictionary<K2, U2> >& dictB)
195 {
196 ASPOSE_UNUSED(dictA);
197 ASPOSE_UNUSED(dictB);
198 return false;
199 }
200
201 // HashSet
208 template <typename T, typename U>
209 static bool AreEqual(const SharedPtr< SCG::HashSet<T> >& containerPtrA, const SharedPtr< SCG::HashSet<U> >& containerPtrB)
210 {
211 if ((void*)containerPtrA.GetObjectOrNull() == (void*)containerPtrB.GetObjectOrNull())
212 return true;
213
214 if (!containerPtrA || !containerPtrB)
215 return false;
216
217 if (containerPtrA->data().size() != containerPtrB->data().size())
218 return false;
219
220 return std::equal(containerPtrA->data().begin(), containerPtrA->data().end(), containerPtrB->data().begin());
221 }
228 template <typename T, typename U>
229 static bool AreEqual(const SharedPtr< SCG::HashSet< SharedPtr<T> > >& contA,
230 const SharedPtr< SCG::HashSet< SharedPtr<U> > >& contB)
231 {
232 if ((void*)contA.GetObjectOrNull() == (void*)contB.GetObjectOrNull())
233 return true;
234
235 if (!contA || !contB)
236 return false;
237
238 return AreEqualContainerOfObjects(contA->data(), contB->data());
239 }
240
241 // Queue
248 template <typename T, typename U>
249 static bool AreEqual(const SCG::QueuePtr<T>& queueA, const SCG::QueuePtr<U>& queueB)
250 {
251 return AreEqualData(queueA, queueB);
252 }
259 template <typename T, typename U>
260 static bool AreEqual(const SCG::QueuePtr< SharedPtr<T> >& queueA,
261 const SCG::QueuePtr< SharedPtr<U> >& queueB)
262 {
263 if ((void*)queueA.GetObjectOrNull() == (void*)queueB.GetObjectOrNull())
264 return true;
265
266 if (!queueA || !queueB)
267 return false;
268
269 return AreEqualContainerOfObjects(queueA->data(), queueB->data());
270 }
271
272 // Stack
279 template <typename T, typename U>
280 static bool AreEqual(const SharedPtr< SCG::Stack<T> >& stackA, const SharedPtr< SCG::Stack<U> >& stackB)
281 {
282 return AreEqualData(stackA, stackB);
283 }
290 template <typename T, typename U>
291 static bool AreEqual(const SharedPtr< SCG::Stack< SharedPtr<T> > >& stackA,
292 const SharedPtr< SCG::Stack< SharedPtr<U> > >& stackB)
293 {
294 if ((void*)stackA.GetObjectOrNull() == (void*)stackB.GetObjectOrNull())
295 return true;
296
297 if (!stackA || !stackB)
298 return false;
299
300 return AreEqualContainerOfObjects(stackA->data(), stackB->data());
301 }
302
303 // SortedDitionary
310 template <typename K, typename U>
312 {
313 return AreEqualData(dictA, dictB);
314 }
321 template <typename K, typename U>
322 static bool AreEqual(const SharedPtr<SCG::SortedDictionary<K, SharedPtr<U> >>& dictA,
324 {
325 if ((void*)dictA.GetObjectOrNull() == (void*)dictB.GetObjectOrNull())
326 return true;
327
328 if (!dictA || !dictB)
329 return false;
330
331 return AreEqualMapOfObjects(dictA->data(), dictB->data());
332 }
341 template <typename K1, typename U1, typename K2, typename U2>
343 {
344 return false;
345 }
346
347 // SortedList
354 template <typename K, typename U>
356 {
357 return AreEqualData(dictA, dictB);
358 }
365 template <typename K, typename U>
366 static bool AreEqual(const SharedPtr<SCG::SortedList<K, SharedPtr<U> >>& dictA,
367 const SharedPtr<SCG::SortedList<K, SharedPtr<U> >>& dictB)
368 {
369 if ((void*)dictA.GetObjectOrNull() == (void*)dictB.GetObjectOrNull())
370 return true;
371
372 if (!dictA || !dictB)
373 return false;
374
375 return AreEqualMapOfObjects(dictA->data(), dictB->data());
376 }
385 template <typename K1, typename U1, typename K2, typename U2>
387 {
388 return false;
389 }
390
391 // StringCollection
397 {
398 return AreEqualData(arrA, arrB);
399 }
400
401 // IEnumerable
406 template <typename T, typename U>
408 {
409 auto tenum = et->GetEnumerator();
410 auto uenum = eu->GetEnumerator();
411
412 while (tenum->MoveNext())
413 {
414 if (!uenum->MoveNext())
415 {
416 return false;
417 }
418 if (!AreEqualObjects(tenum->get_Current(), uenum->get_Current()))
419 {
420 return false;
421 }
422 }
423 return !uenum->MoveNext();
424 }
425
426 // ICollection
432 template <typename T>
433 static bool AbstractEqual(SCG::ICollection<T>* const collA, SCG::ICollection<T>* const collB)
434 {
435 static_assert(System::IsBoxable<T>::value, "Unsupported type for ICollection<T,_> compare");
436
437 if (collA == collB)
438 return true;
439
440 if (!collA || !collB)
441 return false;
442
443 if (collA->get_Count() != collB->get_Count())
444 return false;
445
446 if (collA->get_Count() == 0)
447 return true;
448
449 auto enA = collA->GetEnumerator();
450 auto enB = collB->GetEnumerator();
451
452 while (enA->MoveNext() && enB->MoveNext())
453 {
454 auto&& itA = enA->get_Current();
455 auto&& itB = enB->get_Current();
456 if (itA != itB)
457 return false;
458 }
459
460 return true;
461 }
462
463private:
464 // test containers of primitive type
470 template <typename T>
471 static bool AreEqualData(const SharedPtr<T>& containerPtrA,
472 const SharedPtr<T>& containerPtrB)
473 {
474 if (containerPtrA == containerPtrB)
475 return true;
476
477 if (!containerPtrA || !containerPtrB)
478 return false;
479
480 return containerPtrA->data() == containerPtrB->data();
481 }
488 template <typename T, typename U>
489 static bool AreEqualData(const SharedPtr<T>& containerPtrA,
490 const SharedPtr<U>& containerPtrB)
491 {
492 if ((void*)containerPtrA.GetObjectOrNull() == (void*)containerPtrB.GetObjectOrNull())
493 return true;
494
495 if (!containerPtrA || !containerPtrB)
496 return false;
497
498 if (containerPtrA->data().size() != containerPtrB->data().size())
499 return false;
500
501 return std::equal(containerPtrA->data().begin(), containerPtrA->data().end(), containerPtrB->data().begin());
502 }
503
504 // test containers of SharedPtr<T>
511 template <typename T, typename U>
512 static bool AreEqualObjects(const T& ptrA, const U& ptrB)
513 {
514 return System::Object::Equals(ptrA, ptrB);
515 }
522 template <typename K, typename V>
523 static bool AreEqualObjectPairs(const std::pair<K, V>& pairA, const std::pair<K, V>& pairB)
524 {
525 return pairA.first == pairB.first && System::Object::Equals(pairA.second, pairB.second);
526 }
533 template <typename Tvect, typename Uvect>
534 static bool AreEqualContainerOfObjects(Tvect& contA, Uvect& contB)
535 {
536 if (contA.size() != contB.size())
537 return false;
538
539 return std::equal(contA.begin(), contA.end(), contB.begin(),
540 TestCompare::AreEqualObjects<typename Tvect::value_type, typename Uvect::value_type>);
541 }
547 template <typename Tmap>
548 static bool AreEqualMapOfObjects(const Tmap& mapA, const Tmap& mapB)
549 {
550 if (mapA.size() != mapB.size())
551 return false;
552
553#if 0
554 // for ordered map
555 return std::equal(mapA.begin(), mapA.end(), mapB.begin(),
556 TestCompare::AreEqualObjectPairs<Tmap::key_type, Tmap::mapped_type>);
557#else
558 // for ordered and unordered maps
559
560 for (typename Tmap::const_iterator itA = mapA.begin(); itA != mapA.end(); ++itA)
561 {
562 typename Tmap::const_iterator itF = mapB.find(itA->first);
563 if (itF == mapB.end() || !itF->second->Equals(itA->second))
564 return false;
565 }
566
567 return true;
568 }
569#endif
570
571}; // struct TestCompare
572
573} // namespace System
574
575#endif // _aspose_system_test_tools_compare_h_
Class that represents an array data structure. Objects of this class should only be allocated using S...
Definition: array.h:259
Forward declaration of Dictionary class.
Definition: dictionary.h:96
Forward declaration of HashSet class.
Definition: hashset.h:82
Interface of collection of elements. Objects of this class should only be allocated using System::Mak...
Definition: icollection.h:20
virtual int get_Count() const =0
Gets number of elements in collection.
Interface of object providing enumerator on contained elements.
Definition: ienumerable.h:25
virtual SharedPtr< IEnumerator< T > > GetEnumerator()=0
Gets enumerator.
List forward declaration.
Definition: list.h:127
Queue pointer. This type is a pointer to manage other object's deletion. It should be allocated on st...
Definition: queue.h:26
Sorted dictionary type forward declaration.
Definition: sorted_dictionary.h:52
Sorted list wrapping FlatMap structure. Objects of this class should only be allocated using System::...
Definition: sorted_list.h:334
Stack class forward declaration.
Definition: stack.h:87
Stirng collection poiner with access operator.
Definition: string_collection.h:195
virtual bool Equals(ptr obj)
Compares objects using C# Object.Equals semantics.
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Definition: algorithms.h:10
Definition: db_command.h:9
Template predicate that checks if boxing of the specified type is supported.
Definition: boxable_traits.h:16
Service structure providing interface to compare collections.
Definition: compare.h:32
static bool AreEqual(const SharedPtr< Array< T > > &arrA, const SharedPtr< Array< U > > &arrB)
Compares arrays of non-pointers.
Definition: compare.h:41
static bool AreEqual(const SCG::QueuePtr< T > &queueA, const SCG::QueuePtr< U > &queueB)
Compares queues of non-pointers.
Definition: compare.h:249
static bool AreEqual(const SharedPtr< SCG::List< SharedPtr< T > > > &listA, const SharedPtr< SCG::List< SharedPtr< U > > > &listB)
Compares lists of pointers.
Definition: compare.h:83
static bool AreEqual(const SharedPtr< SCG::SortedList< K, SharedPtr< U > > > &dictA, const SharedPtr< SCG::SortedList< K, SharedPtr< U > > > &dictB)
Compares sorted lists of pointer mapped types.
Definition: compare.h:366
static bool AreEqual(const SharedPtr< SCG::SortedList< K1, U1 > > &dictA, const SharedPtr< SCG::SortedList< K2, U2 > > &dictB)
Compares sorted lists of different types.
Definition: compare.h:386
static bool AreEqual(const System::ArrayPtr< T > &arrA, const SharedPtr< SCG::List< U > > &listB)
Compares lists with arrays in non-pointers elements case.
Definition: compare.h:114
static bool AreEqual(const SharedPtr< SCG::SortedList< K, U > > &dictA, const SharedPtr< SCG::SortedList< K, U > > &dictB)
Compares sorted lists of non-pointer mapped types.
Definition: compare.h:355
static bool AreEqual(const System::Collections::Specialized::StringCollectionPtr &arrA, const System::Collections::Specialized::StringCollectionPtr &arrB)
Compares string collections.
Definition: compare.h:396
static bool AreEqual(const SCG::QueuePtr< SharedPtr< T > > &queueA, const SCG::QueuePtr< SharedPtr< U > > &queueB)
Compares queues of pointers.
Definition: compare.h:260
static bool AreEqual(const SharedPtr< SCG::List< T > > &listA, const SharedPtr< SCG::List< U > > &listB)
Compares lists of non-pointers.
Definition: compare.h:72
static bool AreEqual(const SharedPtr< SCG::HashSet< T > > &containerPtrA, const SharedPtr< SCG::HashSet< U > > &containerPtrB)
Compares hashsets of non-pointers.
Definition: compare.h:209
static bool AreEqual(const SharedPtr< SCG::List< T > > &listA, const System::ArrayPtr< U > &arrB)
Compares lists with arrays in non-pointers elements case.
Definition: compare.h:103
static bool AreEqual(const SharedPtr< SCG::SortedDictionary< K, U > > &dictA, const SharedPtr< SCG::SortedDictionary< K, U > > &dictB)
Compares sorted dictionaries of non-pointer mapped types.
Definition: compare.h:311
static bool AreEqual(const SharedPtr< Array< SharedPtr< T > > > &arrA, const SharedPtr< Array< SharedPtr< U > > > &arrB)
Compares arrays of pointers.
Definition: compare.h:52
static bool AreEqual(const SharedPtr< SCG::Stack< T > > &stackA, const SharedPtr< SCG::Stack< U > > &stackB)
Compares stacks of non-pointers.
Definition: compare.h:280
static bool AreEqual(const SharedPtr< SCG::Dictionary< K, U > > &dictA, const SharedPtr< SCG::Dictionary< K, U > > &dictB)
Compares dictionaries of non-pointer mapped types.
Definition: compare.h:163
static bool AreEqual(const SharedPtr< SCG::SortedDictionary< K1, U1 > > &dictA, const SharedPtr< SCG::SortedDictionary< K2, U2 > > &dictB)
Compares sorted dictionaries of different types.
Definition: compare.h:342
static bool AreEqual(const System::ArrayPtr< SharedPtr< T > > &arr, const SharedPtr< SCG::List< SharedPtr< U > > > &list)
Compares lists with arrays in pointers elements case.
Definition: compare.h:125
static bool AreEqual(const SharedPtr< SCG::SortedDictionary< K, SharedPtr< U > > > &dictA, const SharedPtr< SCG::SortedDictionary< K, SharedPtr< U > > > &dictB)
Compares sorted dictionaries of pointer mapped types.
Definition: compare.h:322
static bool AreEqual(const SharedPtr< SCG::HashSet< SharedPtr< T > > > &contA, const SharedPtr< SCG::HashSet< SharedPtr< U > > > &contB)
Compares hashsets of pointers.
Definition: compare.h:229
static bool AreEqual(const SharedPtr< SCG::Stack< SharedPtr< T > > > &stackA, const SharedPtr< SCG::Stack< SharedPtr< U > > > &stackB)
Compares stacks of pointers.
Definition: compare.h:291
static bool AbstractEqual(SCG::ICollection< T > *const collA, SCG::ICollection< T > *const collB)
Compares two collections of unknown type.
Definition: compare.h:433
static bool AreEqual(const SharedPtr< SCG::Dictionary< K1, U1 > > &dictA, const SharedPtr< SCG::Dictionary< K2, U2 > > &dictB)
Compares dictionaries of different types.
Definition: compare.h:194
static bool AreEqual(const System::SharedPtr< SCG::IEnumerable< T > > &et, const System::SharedPtr< SCG::IEnumerable< U > > &eu)
Compares IEnumerable instances.
Definition: compare.h:407
static bool AreEqual(const SharedPtr< SCG::List< SharedPtr< T > > > &list, const System::ArrayPtr< SharedPtr< U > > &arr)
Compares lists with arrays in pointers elements case.
Definition: compare.h:143
static bool AreEqual(const SharedPtr< SCG::Dictionary< K, SharedPtr< U > > > &dictA, const SharedPtr< SCG::Dictionary< K, SharedPtr< U > > > &dictB)
Compares dictionaries of pointer mapped types.
Definition: compare.h:174