Page Menu
Home
Xreate
Search
Configure Global Search
Log In
Docs
Questions
Repository
Issues
Patches
Internal API
Files
F2729501
attachments.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Mar 13, 2:48 AM
Size
3 KB
Mime Type
text/x-c++
Expires
Sun, Mar 15, 2:48 AM (1 d, 45 m)
Engine
blob
Format
Raw Data
Handle
243043
Attached To
rXR Xreate
attachments.h
View Options
//
// Created by pgess on 3/15/15.
//
#ifndef _XREATE_ATTACHMENTS_H_
#define _XREATE_ATTACHMENTS_H_
#include <map>
namespace xreate
{
//Attachemnt Tags:
struct IsDeclVisited{};
//Atachments dictionary
template<class Tag>
struct AttachmentsDictionary
{
// typedef void Data;
};
template<>
struct AttachmentsDictionary<IsDeclVisited>
{
typedef bool Data;
static const unsigned int key = 0;
};
class Symbol;
typedef unsigned int VID;
class AttachmentsImpl
{
friend class SymbolAttachments;
};
//TODO copy function to copy whole data from symbol to symbol: copy(sTo, sFrom);
class SymbolAttachments
{
public:
//TODO add specialization for pointers
template<class Tag>
static void put(const Symbol& symbol, typename AttachmentsDictionary<Tag>::Data && data)
{
typedef typename AttachmentsDictionary<Tag>::Data Typ;
const unsigned int key = AttachmentsDictionary<Tag>::key;
Typ* ptr = new Typ(data);
put(symbol, key, ptr);
}
/*
template<class Tag>
using Tag2 = std::enable_if<std::is_pointer<Tag>, Tag>::
static void put(const Symbol& symbol, typename AttachmentsDictionary<Tag>::Data && data)
{
typedef typename AttachmentsDictionary<Tag>::Data Typ;
Typ* ptr = new Typ(data);
AttachmentsImpl::put(symbol, ptr);
}
*/
template<class Tag>
static typename AttachmentsDictionary<Tag>::Data& get(const Symbol& symbol, typename AttachmentsDictionary<Tag>::Data&& valueDefault)
{
typedef typename AttachmentsDictionary<Tag>::Data Typ;
const unsigned int key = AttachmentsDictionary<Tag>::key;
Typ* def = new Typ(valueDefault);
Typ* result = static_cast<Typ*> (get(symbol, key, def));
if (result != def) delete def;
return *result;
}
template<class Tag>
static typename AttachmentsDictionary<Tag>::Data& get(const Symbol& symbol)
{
typedef typename AttachmentsDictionary<Tag>::Data Typ;
const unsigned int key = AttachmentsDictionary<Tag>::key;
Typ* result = static_cast<Typ*> (get(symbol, key, nullptr));
assert(result != nullptr); // data not found for the symbol
return *result;
}
template<class Tag>
static bool exists(const Symbol& symbol)
{
const unsigned int key = AttachmentsDictionary<Tag>::key;
return exists(symbol, key);
}
private:
typedef std::map<VID, void*> Attachment;
std::map<unsigned int, Attachment> __data;
static void put(const Symbol& symbol, unsigned int key, void* data);
static void* get(const Symbol& symbol, unsigned int key, void *def);
static bool exists(const Symbol& symbol, unsigned int key);
};
}
#endif //_XREATE_ATTACHMENTS_H_
Event Timeline
Log In to Comment