1 
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9 // Copyright (c) 2014-2018 Francois Beaune, The appleseedhq Organization
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a copy
12 // of this software and associated documentation files (the "Software"), to deal
13 // in the Software without restriction, including without limitation the rights
14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 // copies of the Software, and to permit persons to whom the Software is
16 // furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included in
19 // all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 // THE SOFTWARE.
28 //
29 
30 // Interface header.
31 #include "attributeset.h"
32 
33 // Standard headers.
34 #include <cstring>
35 
36 using namespace std;
37 
38 namespace foundation
39 {
40 
41 //
42 // AttributeSet class implementation.
43 //
44 
~AttributeSet()45 AttributeSet::~AttributeSet()
46 {
47     for (size_t i = 0; i < m_channels.size(); ++i)
48         delete m_channels[i];
49 }
50 
create_channel(const string & name,const NumericTypeID type,const size_t dimension)51 AttributeSet::ChannelID AttributeSet::create_channel(
52     const string&       name,
53     const NumericTypeID type,
54     const size_t        dimension)
55 {
56     assert(dimension > 0);
57 
58     Channel* channel = new Channel();
59     channel->m_name = name;
60     channel->m_type = type;
61     channel->m_dimension = dimension;
62     channel->m_value_size = NumericType::size(type) * dimension;
63     m_channels.push_back(channel);
64 
65     return m_channels.size() - 1;
66 }
67 
delete_channel(const ChannelID channel_id)68 void AttributeSet::delete_channel(const ChannelID channel_id)
69 {
70     assert(channel_id < m_channels.size());
71 
72     delete m_channels[channel_id];
73 
74     m_channels.erase(m_channels.begin() + channel_id);
75 }
76 
find_channel(const char * name) const77 AttributeSet::ChannelID AttributeSet::find_channel(const char* name) const
78 {
79     assert(name);
80 
81     const size_t channel_count = m_channels.size();
82 
83     for (size_t i = 0; i < channel_count; ++i)
84     {
85         if (!strcmp(m_channels[i]->m_name.c_str(), name))
86             return i;
87     }
88 
89     return InvalidChannelID;
90 }
91 
92 }   // namespace foundation
93