X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fcontent_part.h;h=eb96b13710e210593ca47c8911225362d5bfb084;hb=4b7185e4eda53534c4d71a1f31ba33ca3dd8dc8d;hp=2d0f73f7f87096c76e3cb8bf381a7ea3160fca4d;hpb=78664f8073256de51355c9162f61a4ae4fa560d7;p=dcpomatic.git diff --git a/src/lib/content_part.h b/src/lib/content_part.h index 2d0f73f7f..eb96b1371 100644 --- a/src/lib/content_part.h +++ b/src/lib/content_part.h @@ -1,23 +1,31 @@ + /* Copyright (C) 2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ +#ifndef DCPOMATIC_CONTENT_PART_H +#define DCPOMATIC_CONTENT_PART_H + +#include "content.h" +#include "change_signaller.h" #include +#include class Content; class Film; @@ -25,13 +33,43 @@ class Film; class ContentPart { public: - ContentPart (Content* parent, boost::shared_ptr film) + explicit ContentPart (Content* parent) : _parent (parent) - , _film (film) {} protected: + template + void + maybe_set (T& member, T new_value, int property) const + { + ChangeSignaller cc (_parent, property); + { + boost::mutex::scoped_lock lm (_mutex); + if (member == new_value) { + cc.abort (); + return; + } + member = new_value; + } + } + + template + void + maybe_set (boost::optional& member, T new_value, int property) const + { + ChangeSignaller cc (_parent, property); + { + boost::mutex::scoped_lock lm (_mutex); + if (member && member.get() == new_value) { + cc.abort (); + return; + } + member = new_value; + } + } + Content* _parent; - boost::weak_ptr _film; mutable boost::mutex _mutex; }; + +#endif