#ifndef INTERMEDIATE_STORAGE_H #define INTERMEDIATE_STORAGE_H #include #include #include #include #include "data/StorageTypes.h" #include "data/Storage.h" class IntermediateStorage: public Storage { public: IntermediateStorage(); virtual ~IntermediateStorage(); void clear(); size_t getByteSize() const; size_t getSourceLocationCount() const; void setAllFilesIncomplete(); void setFilesWithErrorsIncomplete(); virtual Id addNode(int type, const std::string& serializedName); virtual void addFile(const Id id, const std::string& filePath, const std::string& modificationTime, bool complete); virtual void addSymbol(const Id id, int definitionKind); virtual Id addEdge(int type, Id sourceId, Id targetId); virtual Id addLocalSymbol(const std::string& name); virtual Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type); virtual void addOccurrence(Id elementId, Id sourceLocationId); virtual void addComponentAccess(Id nodeId , int type); virtual void addCommentLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol); virtual void addError(const std::string& message, const FilePath& filePath, uint startLine, uint startCol, bool fatal, bool indexed); virtual void forEachNode(std::function callback) const; virtual void forEachFile(std::function callback) const; virtual void forEachSymbol(std::function callback) const; virtual void forEachEdge(std::function callback) const; virtual void forEachLocalSymbol(std::function callback) const; virtual void forEachSourceLocation(std::function callback) const; virtual void forEachOccurrence(std::function callback) const; virtual void forEachComponentAccess(std::function callback) const; virtual void forEachCommentLocation(std::function callback) const; virtual void forEachError(std::function callback) const; // for conversion to and from 'SharedIntermediateStorage' std::vector getStorageNodes() const; std::vector getStorageFiles() const; std::vector getStorageSymbols() const; std::vector getStorageEdges() const; std::vector getStorageLocalSymbols() const; std::vector getStorageSourceLocations() const; std::vector getStorageOccurrences() const; std::vector getComponentAccesses() const; std::vector getCommentLocations() const; std::vector getErrors() const; void setStorageNodes(const std::vector& storageNodes); void setStorageFiles(const std::vector& storageFiles); void setStorageSymbols(const std::vector& storageSymbols); void setStorageEdges(const std::vector& storageEdges); void setStorageLocalSymbols(const std::vector& storageLocalSymbols); void setStorageSourceLocations(const std::vector& storageSourceLocations); void setStorageOccurrences(const std::vector& storageOccurrences); void setComponentAccesses(const std::vector& componentAccesses); void setCommentLocations(const std::vector& commentLocations); void setErrors(const std::vector& errors); Id getNextId() const; void setNextId(const Id nextId); private: std::string serialize(const StorageNode& node) const; std::string serialize(const StorageFile& file) const; std::string serialize(const StorageEdge& edge) const; std::string serialize(const StorageLocalSymbol& localSymbol) const; std::string serialize(const StorageSourceLocation& sourceLocation) const; std::string serialize(const StorageOccurrence& occurrence) const; std::string serialize(const StorageComponentAccess& componentAccess) const; std::string serialize(const StorageCommentLocation& commentLocation) const; std::string serialize(const StorageError& error) const; std::unordered_map m_nodes; std::vector m_nodesInOrder; std::unordered_set m_serializedFiles; // this is used to prevent duplicates (unique) std::vector m_files; std::vector m_symbols; std::unordered_map m_edges; std::vector m_edgesInOrder; std::unordered_map m_localSymbols; std::unordered_map m_sourceLocations; std::unordered_set m_serializedOccurrences; // this is used to prevent duplicates (unique) std::vector m_occurrences; std::unordered_set m_serializedComponentAccesses; // this is used to prevent duplicates (unique) std::vector m_componentAccesses; std::unordered_set m_serializedCommentLocations; // this is used to prevent duplicates (unique) std::vector m_commentLocations; std::unordered_set m_serializedErrors; // this is used to prevent duplicates (unique) std::vector m_errors; Id m_nextId; }; #endif // INTERMEDIATE_STORAGE_H