d7c746d1e39d1121bdbfdd3886682d4d05aa7d1e
[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 & operator[] (std::size_t index) {
63                 return _spl[index];
64         }
65
66         SPLEntry const & operator[] (std::size_t index) const {
67                 return _spl[index];
68         void swap(size_t a, size_t b) {
69                 std::iter_swap(_spl.begin() + a, _spl.begin() + b);
70         }
71
72         void read (boost::filesystem::path path, ContentStore* store);
73         void write (boost::filesystem::path path) const;
74
75         std::string id () const {
76                 return _id;
77         }
78
79         std::string name () const {
80                 return _name;
81         }
82
83         void set_name (std::string name) {
84                 _name = name;
85         }
86
87         bool missing () const {
88                 return _missing;
89         }
90
91 private:
92         std::string _id;
93         std::string _name;
94         std::vector<SPLEntry> _spl;
95         /** true if any content was missing when read() was last called on this SPL */
96         bool _missing;
97 };
98
99
100 class SignalSPL : public SPL
101 {
102 public:
103         enum class Change {
104                 NAME,
105                 CONTENT,
106         };
107
108         SignalSPL () {}
109
110         SignalSPL (std::string name)
111                 : SPL (name)
112         {}
113
114         void set_name (std::string name) {
115                 SPL::set_name (name);
116                 Changed(Change::NAME);
117         }
118
119         boost::signals2::signal<void (Change)> Changed;
120 };
121
122 #endif