10 #ifndef smtk_attribute_ReferenceItem_h
11 #define smtk_attribute_ReferenceItem_h
13 #include "smtk/attribute/Item.h"
15 #include "smtk/common/UUID.h"
16 #include "smtk/resource/Lock.h"
31 class ReferenceItemDefinition;
32 class ValueItemDefinition;
68 typedef std::random_access_iterator_tag iterator_category;
70 typedef value_type reference;
71 typedef value_type pointer;
72 typedef std::ptrdiff_t difference_type;
90 reference operator*()
const;
91 pointer operator->()
const;
92 reference operator[](
const difference_type& d);
107 std::unique_ptr<CacheIterator> m_cacheIterator;
112 using Key = std::pair<smtk::common::UUID, smtk::common::UUID>;
126 std::size_t numberOfValues()
const;
128 bool setNumberOfValues(std::size_t newSize);
136 bool removeInvalidValues();
139 virtual std::shared_ptr<const ReferenceItemDefinition> definition()
const;
141 const std::multimap<std::string, std::string>& acceptableEntries()
const;
144 std::size_t numberOfRequiredValues()
const;
146 std::size_t maxNumberOfValues()
const;
177 template<
typename Container>
180 std::function<
typename Container::value_type(
const PersistentObjectPtr&)> converter =
181 [](
const PersistentObjectPtr& obj) {
return obj; })
const
183 for (
auto it = this->begin(); it != this->end(); ++it)
190 typename Container::value_type val = converter(*it);
193 result.insert(result.end(), val);
197 template<
typename Container>
203 this->as(result, converter);
214 Key objectKey(std::size_t i = 0)
const;
215 bool setObjectKey(std::size_t i,
const Key& key);
216 bool setObjectKey(std::size_t i,
const Key& key, std::size_t conditional);
221 typename T::Ptr valueAs(std::size_t i = 0)
const
223 return std::dynamic_pointer_cast<T>(this->value(i));
229 return this->isValueValid(0, entity);
245 bool setValues(I vbegin, I vend,
typename std::iterator_traits<I>::difference_type offset = 0);
247 bool appendValues(I vbegin, I vend);
249 template<
typename I,
typename T>
254 typename std::iterator_traits<I>::difference_type offset = 0);
255 template<
typename I,
typename T>
256 bool appendValuesVia(I vbegin, I vend,
const T& converter);
275 bool removeValue(std::size_t i);
277 void detachOwningResource()
override;
279 void reset()
override;
281 virtual std::string valueAsString()
const;
288 virtual std::string valueAsString(std::size_t i)
const;
298 virtual bool isSet(std::size_t i = 0)
const;
300 virtual void unset(std::size_t i = 0);
302 virtual std::size_t numberOfSetValues()
const;
311 const CopyAssignmentOptions& options,
315 bool isExtensible()
const;
320 const_iterator begin()
const;
324 const_iterator end()
const;
337 smtk::resource::LockType lockType()
const;
348 bool activeChildren =
true)
override;
357 const std::map<std::string, smtk::attribute::ItemPtr>&
childrenItems()
const
359 return m_childrenItems;
369 if (
static_cast<std::size_t
>(i) >= m_activeChildrenItems.size())
374 return m_activeChildrenItems[
static_cast<std::size_t
>(i)];
401 bool resolve()
const;
406 bool isValidInternal(
bool useCategories,
const std::set<std::string>& categories)
const override;
408 std::vector<Key> m_keys;
421 void updateActiveChildrenItems();
431 bool iteratorIsSet(
const I& iterator)
const;
433 void assignToCache(std::size_t i,
const PersistentObjectPtr& obj)
const;
434 void appendToCache(
const PersistentObjectPtr& obj)
const;
437 mutable std::unique_ptr<Cache> m_cache;
439 std::map<std::string, smtk::attribute::ItemPtr> m_childrenItems;
441 std::vector<smtk::attribute::ItemPtr> m_activeChildrenItems;
443 std::size_t m_currentConditional;
446 std::size_t m_nextUnsetPos;
450 SMTKCORE_EXPORT
bool ReferenceItem::iteratorIsSet<ReferenceItem::const_iterator>(
454 bool ReferenceItem::setValues(
457 typename std::iterator_traits<I>::difference_type offset)
460 std::size_t num = std::distance(vbegin, vend) + offset;
464 std::size_t firstUnsetPos = -1;
466 for (I it = vbegin; it != vend; ++it, ++i)
468 if (!iteratorIsSet(it))
470 if (firstUnsetPos > (offset + i))
472 firstUnsetPos = offset + i;
477 if (!this->
setValue(offset + i, *it))
480 if (firstUnsetPos > (offset + i))
482 firstUnsetPos = offset + i;
488 if (m_nextUnsetPos > firstUnsetPos)
490 m_nextUnsetPos = firstUnsetPos;
502 bool ReferenceItem::appendValues(I vbegin, I vend)
507 template<
typename I,
typename T>
508 bool ReferenceItem::setValuesVia(
512 typename std::iterator_traits<I>::difference_type offset)
515 std::size_t num = std::distance(vbegin, vend) + offset;
520 std::size_t firstUnsetPos = -1;
521 for (I it = vbegin; it != vend; ++it, ++i)
523 if (!iteratorIsSet(it))
525 if (firstUnsetPos > (offset + i))
527 firstUnsetPos = offset + i;
532 if (!this->
setValue(offset + i, converter(*it)))
534 if (firstUnsetPos > (offset + i))
536 firstUnsetPos = offset + i;
542 if (m_nextUnsetPos > firstUnsetPos)
544 m_nextUnsetPos = firstUnsetPos;
555 template<
typename I,
typename T>
556 bool ReferenceItem::appendValuesVia(I vbegin, I vend,
const T& converter)
558 return this->setValuesVia(vbegin, vend, converter, this->
numberOfValues());
562 bool ReferenceItem::iteratorIsSet(
const I& iterator)
const
564 return !!(*iterator);