Navigation Menu

Skip to content

Commit

Permalink
NodeDefManager: Improve const-correctness of interfaces
Browse files Browse the repository at this point in the history
- Add ability to explicitly reset NodeResolve state (useful for unittesting)
- Remove non-essential NodeResolve methods modifying state from INodeDefManager
- Add const qualifier to NodeDefManager and ContentFeatures serialize
  • Loading branch information
kwolekr committed May 5, 2015
1 parent b785577 commit 633af58
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 48 deletions.
25 changes: 16 additions & 9 deletions src/nodedef.cpp
Expand Up @@ -241,7 +241,7 @@ void ContentFeatures::reset()
sound_dug = SimpleSoundSpec();
}

void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
{
if(protocol_version < 24){
serializeOld(os, protocol_version);
Expand Down Expand Up @@ -398,9 +398,9 @@ class CNodeDefManager: public IWritableNodeDefManager {
virtual content_t allocateDummy(const std::string &name);
virtual void updateAliases(IItemDefManager *idef);
virtual void updateTextures(IGameDef *gamedef,
/*argument: */void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress),
/*argument: */void *progress_callback_args);
void serialize(std::ostream &os, u16 protocol_version);
void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress),
void *progress_cbk_args);
void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is);

inline virtual bool getNodeRegistrationStatus() const;
Expand All @@ -409,6 +409,7 @@ class CNodeDefManager: public IWritableNodeDefManager {
virtual void pendNodeResolve(NodeResolver *nr, NodeResolveMethod how);
virtual bool cancelNodeResolveCallback(NodeResolver *nr);
virtual void runNodeResolveCallbacks();
virtual void resetNodeResolveState();

private:
void addNameIdMapping(content_t i, std::string name);
Expand Down Expand Up @@ -474,8 +475,7 @@ void CNodeDefManager::clear()
m_group_to_items.clear();
m_next_id = 0;

m_node_registration_complete = false;
m_pending_resolve_callbacks.clear();
resetNodeResolveState();

u32 initial_length = 0;
initial_length = MYMAX(initial_length, CONTENT_UNKNOWN + 1);
Expand Down Expand Up @@ -972,7 +972,7 @@ void CNodeDefManager::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
#endif


void CNodeDefManager::serialize(std::ostream &os, u16 protocol_version)
void CNodeDefManager::serialize(std::ostream &os, u16 protocol_version) const
{
writeU8(os, 1); // version
u16 count = 0;
Expand All @@ -981,7 +981,7 @@ void CNodeDefManager::serialize(std::ostream &os, u16 protocol_version)
if (i == CONTENT_IGNORE || i == CONTENT_AIR
|| i == CONTENT_UNKNOWN)
continue;
ContentFeatures *f = &m_content_features[i];
const ContentFeatures *f = &m_content_features[i];
if (f->name == "")
continue;
writeU16(os2, i);
Expand Down Expand Up @@ -1062,7 +1062,7 @@ IWritableNodeDefManager *createNodeDefManager()


//// Serialization of old ContentFeatures formats
void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version)
void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
{
if (protocol_version == 13)
{
Expand Down Expand Up @@ -1342,6 +1342,13 @@ void CNodeDefManager::runNodeResolveCallbacks()
}


void CNodeDefManager::resetNodeResolveState()
{
m_node_registration_complete = false;
m_pending_resolve_callbacks.clear();
}


////
//// NodeResolver
////
Expand Down
35 changes: 16 additions & 19 deletions src/nodedef.h
Expand Up @@ -265,9 +265,9 @@ struct ContentFeatures
ContentFeatures();
~ContentFeatures();
void reset();
void serialize(std::ostream &os, u16 protocol_version);
void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is);
void serializeOld(std::ostream &os, u16 protocol_version);
void serializeOld(std::ostream &os, u16 protocol_version) const;
void deSerializeOld(std::istream &is, int version);

/*
Expand All @@ -288,48 +288,44 @@ enum NodeResolveMethod {
NODE_RESOLVE_DEFERRED,
};

class INodeDefManager
{
class INodeDefManager {
public:
INodeDefManager(){}
virtual ~INodeDefManager(){}
// Get node definition
virtual const ContentFeatures& get(content_t c) const=0;
virtual const ContentFeatures& get(const MapNode &n) const=0;
virtual const ContentFeatures &get(content_t c) const=0;
virtual const ContentFeatures &get(const MapNode &n) const=0;
virtual bool getId(const std::string &name, content_t &result) const=0;
virtual content_t getId(const std::string &name) const=0;
// Allows "group:name" in addition to regular node names
virtual void getIds(const std::string &name, std::set<content_t> &result)
const=0;
virtual const ContentFeatures& get(const std::string &name) const=0;
virtual const ContentFeatures &get(const std::string &name) const=0;

virtual void serialize(std::ostream &os, u16 protocol_version)=0;
virtual void serialize(std::ostream &os, u16 protocol_version) const=0;

virtual bool getNodeRegistrationStatus() const=0;
virtual void setNodeRegistrationStatus(bool completed)=0;

virtual void pendNodeResolve(NodeResolver *nr, NodeResolveMethod how)=0;
virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0;
virtual void runNodeResolveCallbacks()=0;
};

class IWritableNodeDefManager : public INodeDefManager
{
class IWritableNodeDefManager : public INodeDefManager {
public:
IWritableNodeDefManager(){}
virtual ~IWritableNodeDefManager(){}
virtual IWritableNodeDefManager* clone()=0;
// Get node definition
virtual const ContentFeatures& get(content_t c) const=0;
virtual const ContentFeatures& get(const MapNode &n) const=0;
virtual const ContentFeatures &get(content_t c) const=0;
virtual const ContentFeatures &get(const MapNode &n) const=0;
virtual bool getId(const std::string &name, content_t &result) const=0;
// If not found, returns CONTENT_IGNORE
virtual content_t getId(const std::string &name) const=0;
// Allows "group:name" in addition to regular node names
virtual void getIds(const std::string &name, std::set<content_t> &result)
const=0;
const=0;
// If not found, returns the features of CONTENT_UNKNOWN
virtual const ContentFeatures& get(const std::string &name) const=0;
virtual const ContentFeatures &get(const std::string &name) const=0;

// Register node definition by name (allocate an id)
// If returns CONTENT_IGNORE, could not allocate id
Expand All @@ -348,10 +344,10 @@ class IWritableNodeDefManager : public INodeDefManager
Update tile textures to latest return values of TextueSource.
*/
virtual void updateTextures(IGameDef *gamedef,
/*argument: */void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress),
/*argument: */void *progress_callback_args)=0;
void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress),
void *progress_cbk_args)=0;

virtual void serialize(std::ostream &os, u16 protocol_version)=0;
virtual void serialize(std::ostream &os, u16 protocol_version) const=0;
virtual void deSerialize(std::istream &is)=0;

virtual bool getNodeRegistrationStatus() const=0;
Expand All @@ -360,6 +356,7 @@ class IWritableNodeDefManager : public INodeDefManager
virtual void pendNodeResolve(NodeResolver *nr, NodeResolveMethod how)=0;
virtual bool cancelNodeResolveCallback(NodeResolver *nr)=0;
virtual void runNodeResolveCallbacks()=0;
virtual void resetNodeResolveState()=0;
};

IWritableNodeDefManager *createNodeDefManager();
Expand Down
34 changes: 14 additions & 20 deletions src/unittest/test_noderesolver.cpp
Expand Up @@ -31,36 +31,30 @@ class TestNodeResolver : public TestBase {

void runTests(IGameDef *gamedef);

void testNodeResolving(INodeDefManager *ndef);
void testPendingResolveCancellation(INodeDefManager *ndef);
void testDirectResolveMethod(INodeDefManager *ndef);
void testNoneResolveMethod(INodeDefManager *ndef);
void testNodeResolving(IWritableNodeDefManager *ndef);
void testPendingResolveCancellation(IWritableNodeDefManager *ndef);
void testDirectResolveMethod(IWritableNodeDefManager *ndef);
void testNoneResolveMethod(IWritableNodeDefManager *ndef);
};

static TestNodeResolver g_test_instance;

void TestNodeResolver::runTests(IGameDef *gamedef)
{
IWritableNodeDefManager *parent_ndef;
INodeDefManager *ndef;
IWritableNodeDefManager *ndef =
(IWritableNodeDefManager *)gamedef->getNodeDefManager();

parent_ndef = (IWritableNodeDefManager *)gamedef->getNodeDefManager();

ndef = parent_ndef->clone();
ndef->resetNodeResolveState();
TEST(testNodeResolving, ndef);
delete ndef;

ndef = parent_ndef->clone();
ndef->resetNodeResolveState();
TEST(testPendingResolveCancellation, ndef);
delete ndef;

ndef = parent_ndef->clone();
ndef->resetNodeResolveState();
TEST(testDirectResolveMethod, ndef);
delete ndef;

ndef = parent_ndef->clone();
ndef->resetNodeResolveState();
TEST(testNoneResolveMethod, ndef);
delete ndef;
}

class Foobar : public NodeResolver {
Expand Down Expand Up @@ -113,7 +107,7 @@ void Foobaz::resolveNodeNames()
}


void TestNodeResolver::testNodeResolving(INodeDefManager *ndef)
void TestNodeResolver::testNodeResolving(IWritableNodeDefManager *ndef)
{
Foobar foobar;
size_t i;
Expand Down Expand Up @@ -191,7 +185,7 @@ void TestNodeResolver::testNodeResolving(INodeDefManager *ndef)
}


void TestNodeResolver::testPendingResolveCancellation(INodeDefManager *ndef)
void TestNodeResolver::testPendingResolveCancellation(IWritableNodeDefManager *ndef)
{
Foobaz foobaz1;
foobaz1.test_content1 = 1234;
Expand Down Expand Up @@ -219,7 +213,7 @@ void TestNodeResolver::testPendingResolveCancellation(INodeDefManager *ndef)
}


void TestNodeResolver::testDirectResolveMethod(INodeDefManager *ndef)
void TestNodeResolver::testDirectResolveMethod(IWritableNodeDefManager *ndef)
{
Foobaz foobaz;

Expand All @@ -240,7 +234,7 @@ void TestNodeResolver::testDirectResolveMethod(INodeDefManager *ndef)
}


void TestNodeResolver::testNoneResolveMethod(INodeDefManager *ndef)
void TestNodeResolver::testNoneResolveMethod(IWritableNodeDefManager *ndef)
{
Foobaz foobaz;

Expand Down

0 comments on commit 633af58

Please sign in to comment.