From: bangerth Date: Mon, 13 Jun 2011 18:18:37 +0000 (+0000) Subject: Adjust one test. Add another. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bbce2802fe743c1d379dfec3654e62e98ade23df;p=dealii-svn.git Adjust one test. Add another. git-svn-id: https://svn.dealii.org/trunk@23814 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/tests/serialization/pointer_03.cc b/tests/serialization/pointer_03.cc index 8f619721dc..1721d699f7 100644 --- a/tests/serialization/pointer_03.cc +++ b/tests/serialization/pointer_03.cc @@ -91,6 +91,10 @@ void test () // re-created pair point to Assert (pair_2.first == pair_2.second, ExcInternalError()); Assert (object_number == 3, ExcInternalError()); + + // destroy the newly created object. this + // must succeed + delete pair_2.first; delete p; } diff --git a/tests/serialization/pointer_03/cmp/generic b/tests/serialization/pointer_03/cmp/generic index 7ab18c2c52..c1a44def3a 100644 --- a/tests/serialization/pointer_03/cmp/generic +++ b/tests/serialization/pointer_03/cmp/generic @@ -6,5 +6,6 @@ DEAL::22 serialization::archive 9 0 0 1 1 0 DEAL::Default constructor. Object number 2 DEAL::Serializing object number 2 via N5boost7archive13text_iarchiveE +DEAL::destructor. Object number 2 DEAL::destructor. Object number 1 DEAL::OK diff --git a/tests/serialization/pointer_04.cc b/tests/serialization/pointer_04.cc new file mode 100644 index 0000000000..44c8944840 --- /dev/null +++ b/tests/serialization/pointer_04.cc @@ -0,0 +1,120 @@ +//---------------------------- pointer_04.cc --------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2010, 2011 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------- pointer_04.cc --------------------------- + +// test what happens when serializing two objects that have pointers to the +// same common object. the two objects here are the members of a std::pair +// +// compared to the _03 test, the object pointed to here is an automatic object +// on the stack; boost::serialization can't know that and must create a new +// object on the heap which we later have to destroy by hand + +#include "serialization.h" + +#include +#include + +int object_number = 1; + +class C +{ + public: + C () + { + object_number = ::object_number++; + deallog << "Default constructor. Object number " + << object_number + << std::endl; + } + + C (const C&) + { + object_number = ::object_number++; + deallog << "copy constructor. Object number " + << object_number + << std::endl; + } + + ~C () + { + deallog << "destructor. Object number " + << object_number + << std::endl; + } + + template + void serialize (Archive &ar, const unsigned int version) + { + deallog << "Serializing object number " + << object_number + << " via " << typeid(Archive).name() + << std::endl; + } + + bool operator == (const C &) const + { + return true; + } + + private: + unsigned int object_number; +}; + + +template +bool compare (const std::pair &t1, + const std::pair &t2) +{ + return (*t1.first == *t2.first) && (*t1.second == *t2.second); +} + + +void test () +{ + { + C c; + std::pair pair_1 = {&c, &c}; + std::pair pair_2; + + verify (pair_1, pair_2); + + // boost::serialize should have + // recognized that the two pointers in + // pair_1 point to the same object and + // consequently re-create only one object + // that the two components of the + // re-created pair point to + Assert (pair_2.first == pair_2.second, ExcInternalError()); + Assert (object_number == 3, ExcInternalError()); + + // destroy the newly created object. this + // must succeed and would likely throw + // some sort of error if the object + // pointed to was on the stack (like 'c') + // rather than on the heap + delete pair_2.first; + } +} + + +int main () +{ + std::ofstream logfile("pointer_04/output"); + deallog << std::setprecision(3); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + test (); + + deallog << "OK" << std::endl; +} diff --git a/tests/serialization/pointer_04/cmp/generic b/tests/serialization/pointer_04/cmp/generic new file mode 100644 index 0000000000..c1a44def3a --- /dev/null +++ b/tests/serialization/pointer_04/cmp/generic @@ -0,0 +1,11 @@ + +DEAL::Default constructor. Object number 1 +DEAL::Serializing object number 1 via N5boost7archive13text_oarchiveE +DEAL::22 serialization::archive 9 0 0 1 1 0 +0 1 0 + +DEAL::Default constructor. Object number 2 +DEAL::Serializing object number 2 via N5boost7archive13text_iarchiveE +DEAL::destructor. Object number 2 +DEAL::destructor. Object number 1 +DEAL::OK