diff options
Diffstat (limited to 'src/nodedef.h')
-rw-r--r-- | src/nodedef.h | 168 |
1 files changed, 47 insertions, 121 deletions
diff --git a/src/nodedef.h b/src/nodedef.h index dd76717e1..0c779ddcc 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -40,8 +40,6 @@ class IShaderSource; class IGameDef; typedef std::list<std::pair<content_t, int> > GroupItems; -typedef std::list<std::pair<std::string, std::vector<content_t> *> > - ContentVectorResolveList; enum ContentParamType { @@ -284,125 +282,18 @@ struct ContentFeatures } }; -struct NodeResolveInfo { - std::string n_wanted; - std::string n_alt; - content_t c_fallback; - content_t *output; -}; - -#define NR_STATUS_FAILURE 0 -#define NR_STATUS_PENDING 1 -#define NR_STATUS_SUCCESS 2 - -/** - NodeResolver - - NodeResolver attempts to resolve node names to content ID integers. If the - node registration phase has not yet finished at the time the resolution - request is placed, the request is marked as pending and added to an internal - queue. The name resolution request is later satisfied by writing directly - to the output location when the node registration phase has been completed. - - This is primarily intended to be used for objects registered during script - initialization (i.e. while nodes are being registered) that reference - particular nodes. -*/ -class NodeResolver { -public: - NodeResolver(INodeDefManager *ndef); - ~NodeResolver(); - - /** - Add a request to resolve the node n_wanted and set *content to the - result, or alternatively, n_alt if n_wanted is not found. If n_alt - cannot be found either, or has not been specified, *content is set - to c_fallback. - - If node registration is complete, the request is finished immediately - and NR_STATUS_SUCCESS is returned (or NR_STATUS_FAILURE if no node can - be found). Otherwise, NR_STATUS_PENDING is returned and the resolution - request is queued. - - N.B. If the memory in which content is located has been deallocated - before the pending request had been satisfied, cancelNode() must be - called. - - @param n_wanted Name of node that is wanted. - @param n_alt Name of node in case n_wanted could not be found. Blank - if no alternative node is desired. - @param c_fallback Content ID that content is set to in case of node - resolution failure (should be CONTENT_AIR, CONTENT_IGNORE, etc.) - @param content Pointer to content_t that receives the result of the - node name resolution. - @return Status of node resolution request. - */ - int addNode(const std::string &n_wanted, const std::string &n_alt, - content_t c_fallback, content_t *content); - - /** - Add a request to resolve the node(s) specified by nodename. - - If node registration is complete, the request is finished immediately - and NR_STATUS_SUCCESS is returned if at least one node is resolved; if - zero were resolved, NR_STATUS_FAILURE. Otherwise, NR_STATUS_PENDING is - returned and the resolution request is queued. - - N.B. If the memory in which content_vec is located has been deallocated - before the pending request had been satisfied, cancelNodeList() must be - called. - - @param nodename Name of node (or node group) to be resolved. - @param content_vec Pointer to content_t vector onto which the results - are added. - - @return Status of node resolution request. - */ - int addNodeList(const std::string &nodename, - std::vector<content_t> *content_vec); - - /** - Removes all pending requests from the resolution queue with the output - address of 'content'. - - @param content Location of the content ID for the request being - cancelled. - @return Number of pending requests cancelled. - */ - bool cancelNode(content_t *content); - - /** - Removes all pending requests from the resolution queue with the output - address of 'content_vec'. - - @param content_vec Location of the content ID vector for requests being - cancelled. - @return Number of pending requests cancelled. - */ - int cancelNodeList(std::vector<content_t> *content_vec); - - /** - Carries out all pending node resolution requests. Call this when the - node registration phase has completed. - - Internally marks node registration as complete. +class NodeResolver; +class INodeDefManager; - @return Number of failed pending requests. - */ - int resolveNodes(); - - /** - Returns the status of the node registration phase. - - @return Boolean of whether the registration phase is complete. - */ - bool isNodeRegFinished() { return m_is_node_registration_complete; } +struct NodeResolveInfo { + NodeResolveInfo(NodeResolver *nr) + { + resolver = nr; + } -private: - INodeDefManager *m_ndef; - bool m_is_node_registration_complete; - std::list<NodeResolveInfo *> m_pending_contents; - ContentVectorResolveList m_pending_content_vecs; + std::list<std::string> nodenames; + std::list<size_t> nodename_sizes; + NodeResolver *resolver; }; class INodeDefManager @@ -422,7 +313,14 @@ public: virtual void serialize(std::ostream &os, u16 protocol_version)=0; - virtual NodeResolver *getResolver()=0; + virtual void pendNodeResolve(NodeResolveInfo *nri)=0; + virtual void cancelNodeResolve(NodeResolver *resolver)=0; + virtual void runNodeResolverCallbacks()=0; + + virtual bool getIdFromResolveInfo(NodeResolveInfo *nri, + const std::string &node_alt, content_t c_fallback, content_t &result)=0; + virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri, + std::vector<content_t> &result)=0; }; class IWritableNodeDefManager : public INodeDefManager @@ -464,10 +362,38 @@ public: virtual void serialize(std::ostream &os, u16 protocol_version)=0; virtual void deSerialize(std::istream &is)=0; - virtual NodeResolver *getResolver()=0; + virtual void pendNodeResolve(NodeResolveInfo *nri)=0; + virtual void cancelNodeResolve(NodeResolver *resolver)=0; + virtual void runNodeResolverCallbacks()=0; + + virtual bool getIdFromResolveInfo(NodeResolveInfo *nri, + const std::string &node_alt, content_t c_fallback, content_t &result)=0; + virtual bool getIdsFromResolveInfo(NodeResolveInfo *nri, + std::vector<content_t> &result)=0; }; IWritableNodeDefManager *createNodeDefManager(); +class NodeResolver { +public: + NodeResolver() + { + m_lookup_done = false; + m_ndef = NULL; + } + + ~NodeResolver() + { + if (!m_lookup_done) + m_ndef->cancelNodeResolve(this); + } + + virtual void resolveNodeNames(NodeResolveInfo *nri) = 0; + + bool m_lookup_done; + INodeDefManager *m_ndef; +}; + + #endif |