This file is indexed.

/usr/include/CLAM/DescriptionScope.hxx is in libclam-dev 1.4.0-7.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * Copyright (c) 2004 MUSIC TECHNOLOGY GROUP (MTG)
 *                         UNIVERSITAT POMPEU FABRA
 *
 *
 * This program 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,
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#ifndef _DescriptionScope_hxx_
#define _DescriptionScope_hxx_

#include "DescriptionAttributes.hxx"
#include <map>
#include <vector>

namespace CLAM
{
	/**
	 * A description scope defines a set of attributes which have 
	 * the same ocurrences.
	 * For example,
	 * some attributes will have one occurrence by each note, 
	 * while some others will have one occurrence by each frame.
	 * Thus, we talk about Frame scope, Note scope...
	 *
	 * At least that you were modifying the DescriptionScheme
	 * and DescriptionDataPool implementations, or something related,
	 * you shouldn't use this class directly, use DescriptionScheme instead.
	 * @see SemanticalAnalysis module, for more information on that.
	 * @ingroup SemanticalAnalysis
	 */
	class SchemaError : public Err
	{
		public:
		SchemaError(const std::string & msg) : Err(msg.c_str()) {}
	};

	class DescriptionScope
	{
	public:
		typedef std::map<std::string, unsigned> NamesMap;
		typedef std::vector<AbstractAttribute *> Attributes;
	private:
		NamesMap _nameMap;
		Attributes _attributes;
		std::string _scopeName;
	public:
		DescriptionScope(const std::string & name) : _scopeName(name) {}
		~DescriptionScope();

		/** @return the scope name */
		const std::string & GetName() const
		{
			return _scopeName;
		}

		/** 
		 * Adds the scope an attribute named 'name' using the template parameter 
		 * as the attribute type.
		 * @arg AttributeType The type for the attribute
		 * @arg name The name for the new attribute
		 */
		template <typename AttributeType>
		void Add(const std::string & name)
		{
			unsigned attributeIndex = _nameMap.size();
			bool inserted = 
				_nameMap.insert(std::make_pair(name,attributeIndex)).second;
			CLAM_ASSERT(inserted,("Couldn't add attribute '"+_scopeName+":"+name+"', already present in the scope").c_str());
			_attributes.push_back(new Attribute<AttributeType>(_scopeName, name));
		}

		/**
		 * Returns the attribute index that can be used for fast access to the 
		 * attribute in a spec or even . 
		 * @warning The index is not a confident reference after serialization.
		 * @pre the name should exists
		 */
		unsigned GetIndex(const std::string & name) const
		{
			NamesMap::const_iterator it = _nameMap.find(name);
			CLAM_ASSERT(it!=_nameMap.end(),
				(std::string()+"Accessing an unexisting attribute '"+_scopeName+"':'"+name+"'").c_str());
			return it->second;
		}
		/**
		 * The same as GetIndex but it throws a catchable exception whenever
		 * the name is not available
		 */
		unsigned GetIndexSafe(const std::string & name) const
		{
			NamesMap::const_iterator it = _nameMap.find(name);
			if (it==_nameMap.end())
				throw SchemaError("Accessing an unexisting attribute '"+_scopeName+"':'"+name+"'");
			return it->second;
		}

		unsigned GetNAttributes() const
		{
			return _nameMap.size();
		}

		void * Allocate(unsigned attribute, unsigned size) const
		{
			return _attributes[attribute]->Allocate(size);
		}
		void Deallocate(unsigned attribute, void * buffer) const
		{
			_attributes[attribute]->Deallocate(buffer);
		}

		template <typename AttributeType>
		void CheckType(unsigned attributeIndex, AttributeType *) const
		{
			_attributes[attributeIndex]->CheckType<AttributeType>();
		}

		const std::string & GetAttributeName(unsigned attributeIndex) const
		{
			CLAM_ASSERT(attributeIndex<_attributes.size(),
				"GetAttributeName: Using a wrong index to look up an attribute name");
			AbstractAttribute * attribute = _attributes[attributeIndex];
			return attribute->GetName();
		}
		const AbstractAttribute & GetAttribute(unsigned int attribute) const
		{
			return * _attributes[attribute];
		}
	};

}


#endif// _DescriptionScope_hxx_