Missed update to private test repo version.
[dcpomatic.git] / src / lib / spl.h
1 /*
2     Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 #ifndef DCPOMATIC_SPL_H
23 #define DCPOMATIC_SPL_H
24
25
26 #include "spl_entry.h"
27 #include <dcp/util.h>
28 #include <boost/signals2.hpp>
29 #include <algorithm>
30
31
32 class ContentStore;
33
34
35 class SPL
36 {
37 public:
38         SPL ()
39                 : _id (dcp::make_uuid())
40                 , _missing (false)
41         {}
42
43         SPL (std::string name)
44                 : _id (dcp::make_uuid())
45                 , _name (name)
46                 , _missing (false)
47         {}
48
49
50         void add (SPLEntry e) {
51                 _spl.push_back (e);
52         }
53
54         void remove (std::size_t index) {
55                 _spl.erase (_spl.begin() + index);
56         }
57
58         std::vector<SPLEntry> const & get () const {
59                 return _spl;
60         }
61
62         SPLEntry const & operator[] (std::size_t index) const {
63                 return _spl[index];
64         }
65
66         void swap(size_t a, size_t b) {
67                 std::iter_swap(_spl.begin() + a, _spl.begin() + b);
68         }
69
70         void read (boost::filesystem::path path, ContentStore* store);
71         void write (boost::filesystem::path path) const;
72
73         std::string id () const {
74                 return _id;
75         }
76
77         std::string name () const {
78                 return _name;
79         }
80
81         void set_name (std::string name) {
82                 _name = name;
83         }
84
85         bool missing () const {
86                 return _missing;
87         }
88
89 private:
90         std::string _id;
91         std::string _name;
92         std::vector<SPLEntry> _spl;
93         /** true if any content was missing when read() was last called on this SPL */
94         bool _missing;
95 };
96
97
98 class SignalSPL : public SPL
99 {
100 public:
101         enum class Change {
102                 NAME,
103                 CONTENT,
104         };
105
106         SignalSPL () {}
107
108         SignalSPL (std::string name)
109                 : SPL (name)
110         {}
111
112         void set_name (std::string name) {
113                 SPL::set_name (name);
114                 Changed(Change::NAME);
115         }
116
117         void add(SPLEntry e) {
118                 SPL::add(e);
119                 Changed(Change::CONTENT);
120         }
121
122         void remove(std::size_t index) {
123                 SPL::remove(index);
124                 Changed(Change::CONTENT);
125         }
126
127         void swap(size_t a, size_t b) {
128                 SPL::swap(a, b);
129                 Changed(Change::CONTENT);
130         }
131
132         boost::signals2::signal<void (Change)> Changed;
133 };
134
135 #endif