diff --git a/RippleD.props b/RippleD.props
index 4d5516806b..79a7139809 100644
--- a/RippleD.props
+++ b/RippleD.props
@@ -17,6 +17,7 @@
Level3
$(RepoDir);$(RepoDir)\src\cpp\leveldb;$(RepoDir)\src\cpp\leveldb\include;$(RepoDir)\src\cpp\protobuf\src;$(RepoDir)\src\cpp\protobuf\vsprojects;$(RepoDir)\build\proto;$(RepoDir)\Subtrees\beast;%(AdditionalIncludeDirectories)
/bigobj %(AdditionalOptions)
+ Async
Shlwapi.lib;%(AdditionalDependencies)
diff --git a/modules/ripple_basics/containers/ripple_RangeSet.cpp b/modules/ripple_basics/containers/ripple_RangeSet.cpp
index 5db2feda9f..5801510d87 100644
--- a/modules/ripple_basics/containers/ripple_RangeSet.cpp
+++ b/modules/ripple_basics/containers/ripple_RangeSet.cpp
@@ -6,100 +6,152 @@ inline uint32 max(uint32 x, uint32 y) { return (x > y) ? x : y; }
bool RangeSet::hasValue(uint32 v) const
{
- return mRanges.find(v) != mRanges.end();
+ BOOST_FOREACH(const value_type& it, mRanges)
+ {
+ if (contains(it, v))
+ return true;
+ }
+ return false;
}
uint32 RangeSet::getFirst() const
{
- const_iterator it = begin();
- if (it == end())
+ const_iterator it = mRanges.begin();
+ if (it == mRanges.end())
return RangeSetAbsent;
- return lower(it);
+ return it->first;
}
uint32 RangeSet::getNext(uint32 v) const
{
- for (const_iterator it = begin(); it != end(); ++it)
+ BOOST_FOREACH(const value_type& it, mRanges)
{
- if (upper(it) > v)
- return max(v + 1, lower(it));
+ if (it.first > v)
+ return it.first;
+ if (contains(it, v + 1))
+ return v + 1;
}
return RangeSetAbsent;
}
uint32 RangeSet::getLast() const
{
- const_reverse_iterator it = rbegin();
- if (it == rend())
+ const_reverse_iterator it = mRanges.rbegin();
+ if (it == mRanges.rend())
return RangeSetAbsent;
- return upper(it);
+ return it->second;
}
uint32 RangeSet::getPrev(uint32 v) const
{
- for (const_reverse_iterator it = rbegin(); it != rend(); ++it)
+ BOOST_REVERSE_FOREACH(const value_type& it, mRanges)
{
- if (lower(it) < v)
- return min(v - 1, upper(it));
+ if (it.second < v)
+ return it.second;
+ if (contains(it, v + 1))
+ return v - 1;
}
return RangeSetAbsent;
}
uint32 RangeSet::prevMissing(uint32 v) const
{ // largest number not in the set that is less than the given number
- WriteLog (lsTRACE, RangeSet) << "prevMissing(" << v << ") " << toString();
- for (const_reverse_iterator it = rbegin(); it != rend(); ++it)
+ BOOST_FOREACH(const value_type& it, mRanges)
{
- if ((upper(it) + 1) < v)
- return upper(it) + 1;
- if (lower(it) == 0)
- return RangeSetAbsent;
- if ((lower(it) - 1) < v)
- return lower(it) - 1;
+ if (contains(it, v))
+ return it.first - 1;
+ if (it.first > v)
+ return v + 1;
}
- if (v > 0)
- return v - 1;
return RangeSetAbsent;
}
void RangeSet::setValue(uint32 v)
{
- setRange(v, v);
+ if (!hasValue(v))
+ {
+ mRanges[v] = v;
+ simplify();
+ }
}
void RangeSet::setRange(uint32 minV, uint32 maxV)
{
- mRanges.add(boost::icl::discrete_interval(minV, maxV + 1));
+ while (hasValue(minV))
+ {
+ ++minV;
+ if (minV >= maxV)
+ return;
+ }
+ mRanges[minV] = maxV;
+ simplify();
}
void RangeSet::clearValue(uint32 v)
{
- clearRange(v, v);
-}
-
-void RangeSet::clearRange(uint32 minV, uint32 maxV)
-{
- mRanges.erase(boost::icl::discrete_interval(minV, maxV + 1));
+ for (iterator it = mRanges.begin(); it != mRanges.end(); ++it)
+ {
+ if (contains(*it, v))
+ {
+ if (it->first == v)
+ {
+ if (it->second == v)
+ mRanges.erase(it);
+ else
+ {
+ mRanges[v + 1] = it->second;
+ it->second = v - 1;
+ }
+ }
+ else if (it->second == v)
+ --(it->second);
+ else
+ {
+ uint32 oldEnd = it->second;
+ it->second = v - 1;
+ mRanges[v + 1] = oldEnd;
+ }
+ return;
+ }
+ }
}
std::string RangeSet::toString() const
{
std::string ret;
- for (const_iterator it = begin(); it != end(); ++it)
+ BOOST_FOREACH(value_type const& it, mRanges)
{
if (!ret.empty())
ret += ",";
- if (lower(it) == upper(it))
- ret += boost::lexical_cast(lower(it));
+ if (it.first == it.second)
+ ret += boost::lexical_cast((it.first));
else
- ret += boost::lexical_cast(lower(it)) + "-"
- + boost::lexical_cast(upper(it));
+ ret += boost::lexical_cast(it.first) + "-"
+ + boost::lexical_cast(it.second);
}
if (ret.empty())
return "empty";
return ret;
}
+void RangeSet::simplify()
+{
+ iterator it = mRanges.begin();
+ while (1)
+ {
+ iterator nit = it;
+ if (++nit == mRanges.end())
+ return;
+ if (it->second >= (nit->first - 1))
+ { // ranges overlap
+ it->second = nit->second;
+ mRanges.erase(nit);
+ }
+ else
+ it = nit;
+ }
+}
+
BOOST_AUTO_TEST_SUITE(RangeSet_suite)
BOOST_AUTO_TEST_CASE(RangeSet_test)
diff --git a/modules/ripple_basics/containers/ripple_RangeSet.h b/modules/ripple_basics/containers/ripple_RangeSet.h
index 9a311853cc..44dfa4045e 100644
--- a/modules/ripple_basics/containers/ripple_RangeSet.h
+++ b/modules/ripple_basics/containers/ripple_RangeSet.h
@@ -4,15 +4,22 @@
class RangeSet
{
public:
- typedef boost::icl::interval_set iRangeSet;
- typedef iRangeSet::iterator iterator;
- typedef iRangeSet::const_iterator const_iterator;
- typedef iRangeSet::reverse_iterator reverse_iterator;
- typedef iRangeSet::const_reverse_iterator const_reverse_iterator;
static const uint32 RangeSetAbsent = static_cast(-1);
protected:
- iRangeSet mRanges;
+ std::map mRanges; // First is lowest value in range, last is highest value in range
+
+ typedef std::map::const_iterator const_iterator;
+ typedef std::map::const_reverse_iterator const_reverse_iterator;
+ typedef std::map::value_type value_type;
+ typedef std::map::iterator iterator;
+
+ static bool contains(value_type const& it, uint32 v)
+ {
+ return (it.first <= v) && (it.second >= v);
+ }
+
+ void simplify();
public:
@@ -29,71 +36,10 @@ public:
void setValue(uint32);
void setRange(uint32, uint32);
void clearValue(uint32);
- void clearRange(uint32, uint32);
-
-
- // iterator stuff
- iterator begin() { return mRanges.begin(); }
- iterator end() { return mRanges.end(); }
- const_iterator begin() const { return mRanges.begin(); }
- const_iterator end() const { return mRanges.end(); }
- reverse_iterator rbegin() { return mRanges.rbegin(); }
- reverse_iterator rend() { return mRanges.rend(); }
- const_reverse_iterator rbegin() const { return mRanges.rbegin(); }
- const_reverse_iterator rend() const { return mRanges.rend(); }
-
- static uint32 lower(const_iterator& it) { return it->lower(); }
- static uint32 upper(const_iterator& it) { return it->upper() - 1; }
- static uint32 lower(const_reverse_iterator& it) { return it->lower(); }
- static uint32 upper(const_reverse_iterator& it) { return it->upper() - 1; }
-
std::string toString() const;
};
-inline RangeSet::const_iterator range_begin(const RangeSet& r) { return r.begin(); }
-inline RangeSet::iterator range_begin(RangeSet& r) { return r.begin(); }
-inline RangeSet::const_iterator range_end(const RangeSet& r) { return r.end(); }
-inline RangeSet::iterator range_end(RangeSet& r) { return r.end(); }
-
-namespace boost
-{
- template<> struct range_mutable_iterator
- {
- typedef RangeSet::iterator type;
- };
- template<> struct range_const_iterator
- {
- typedef RangeSet::const_iterator type;
- };
-}
-
-// VFALCO Maybe not the best place for this but it sort of makes sense here
-
-// VFALCO NOTE these three are unused.
-/*
-template T range_check(const T& value, const T& minimum, const T& maximum)
-{
- if ((value < minimum) || (value > maximum))
- throw std::runtime_error("Value out of range");
- return value;
-}
-
-template T range_check_min(const T& value, const T& minimum)
-{
- if (value < minimum)
- throw std::runtime_error("Value out of range");
- return value;
-}
-
-template T range_check_max(const T& value, const T& maximum)
-{
- if (value > maximum)
- throw std::runtime_error("Value out of range");
- return value;
-}
-*/
-
// VFALCO TODO these parameters should not be const references.
template T range_check_cast(const U& value, const T& minimum, const T& maximum)
{
@@ -102,6 +48,7 @@ template T range_check_cast(const U& value, const T& min
return static_cast(value);
}
+
#endif
// vim:ts=4
diff --git a/modules/ripple_basics/ripple_basics.h b/modules/ripple_basics/ripple_basics.h
index eb092665e8..b7552056c0 100644
--- a/modules/ripple_basics/ripple_basics.h
+++ b/modules/ripple_basics/ripple_basics.h
@@ -72,7 +72,7 @@ namespace boost {
// RangeSet
#include
-#include // oof this one is ugly
+//#include // oof this one is ugly
// InstanceCounter
//#include
diff --git a/modules/ripple_basics/utility/ripple_InstanceCounter.h b/modules/ripple_basics/utility/ripple_InstanceCounter.h
index bcdcebddec..f1275320bc 100644
--- a/modules/ripple_basics/utility/ripple_InstanceCounter.h
+++ b/modules/ripple_basics/utility/ripple_InstanceCounter.h
@@ -1,7 +1,7 @@
#ifndef RIPPLE_INSTANCECOUNTER_H
#define RIPPLE_INSTANCECOUNTER_H
-// VFALCO TODO Clean up this junk, remove the macros, replace
+// VFALCO TODO Clean this up, remove the macros, replace
// with a robust leak checker when we have atomics.
//
@@ -38,7 +38,7 @@ protected:
public:
typedef std::pair InstanceCount;
- InstanceType(const char *n) : mInstances(0), mName(n)
+ explicit InstanceType (const char *n) : mInstances(0), mName(n)
{
mNextInstance = sHeadInstance;
sHeadInstance = this;
@@ -65,7 +65,7 @@ public:
{
if (sMultiThreaded)
{
- // VFALCO NOTE Junk that will go away with atomics
+ // VFALCO NOTE This will go away with atomics
mLock.lock();
++mInstances;
mLock.unlock();
diff --git a/modules/ripple_basics/utility/ripple_RandomNumbers.cpp b/modules/ripple_basics/utility/ripple_RandomNumbers.cpp
index 1336434ac8..b2673617e8 100644
--- a/modules/ripple_basics/utility/ripple_RandomNumbers.cpp
+++ b/modules/ripple_basics/utility/ripple_RandomNumbers.cpp
@@ -160,7 +160,7 @@ bool RandomNumbers::platformAddEntropy ()
void RandomNumbers::platformAddPerformanceMonitorEntropy ()
{
- // VFALCO This is how we simulate local functions
+ // VFALCO TODO Remove all this fancy stuff
struct
{
int64 operator() () const
diff --git a/modules/ripple_basics/utility/ripple_Sustain.h b/modules/ripple_basics/utility/ripple_Sustain.h
index bbd612a851..be254a73ec 100644
--- a/modules/ripple_basics/utility/ripple_Sustain.h
+++ b/modules/ripple_basics/utility/ripple_Sustain.h
@@ -19,7 +19,10 @@
#ifndef RIPPLE_SUSTAIN_H
#define RIPPLE_SUSTAIN_H
-// VFALCO TODO figure out what the heck this is??
+// "Sustain" is a system for a buddy process that monitors the main process
+// and relaunches it on a fault.
+//
+// VFALCO TODO Rename this and put it in a class.
extern bool HaveSustain();
extern std::string StopSustain();
extern std::string DoSustain();
diff --git a/modules/ripple_client/ripple_client.cpp b/modules/ripple_client/ripple_client.cpp
index ad6ceb49c4..b565aedea4 100644
--- a/modules/ripple_client/ripple_client.cpp
+++ b/modules/ripple_client/ripple_client.cpp
@@ -22,4 +22,51 @@
@ingroup ripple_client
*/
+#include
+
+#include
+#include
+#include
+
#include "ripple_client.h"
+
+#include "../ripple_basics/ripple_basics.h"
+
+#include "../ripple_data/ripple_data.h"
+
+#include "src/cpp/ripple/ripple_InfoSub.h"
+
+// Order and indentation reflect the hierarchy of dependencies
+ #include "src/cpp/ripple/ripple_HashedObject.h"
+ #include "src/cpp/ripple/ripple_SHAMapItem.h"
+ #include "src/cpp/ripple/ripple_SHAMapNode.h"
+ #include "src/cpp/ripple/ripple_SHAMapAddNode.h"
+ #include "src/cpp/ripple/ripple_SHAMapMissingNode.h"
+ #include "src/cpp/ripple/ripple_SHAMapTreeNode.h"
+ #include "src/cpp/ripple/ripple_SHAMapSyncFilter.h"
+ #include "src/cpp/ripple/ripple_SHAMap.h"
+ #include "src/cpp/ripple/ripple_SerializedTransaction.h"
+ #include "src/cpp/ripple/ripple_SerializedLedger.h"
+ #include "src/cpp/ripple/TransactionMeta.h"
+ #include "src/cpp/ripple/Transaction.h"
+ #include "src/cpp/ripple/AccountState.h"
+ #include "src/cpp/ripple/NicknameState.h"
+ #include "src/cpp/ripple/Ledger.h"
+ #include "src/cpp/ripple/LedgerEntrySet.h"
+ #include "src/cpp/ripple/TransactionEngine.h"
+ #include "src/cpp/ripple/LoadManager.h"
+ #include "src/cpp/ripple/ripple_Peer.h"
+ #include "src/cpp/ripple/ripple_PeerSet.h"
+ #include "src/cpp/ripple/ripple_LedgerAcquire.h"
+ #include "src/cpp/ripple/ripple_LedgerHistory.h"
+ #include "src/cpp/ripple/ripple_CanonicalTXSet.h"
+ #include "src/cpp/ripple/LedgerMaster.h"
+ #include "src/cpp/ripple/ripple_InfoSub.h"
+ #include "src/cpp/ripple/SerializedValidation.h"
+ #include "src/cpp/ripple/LedgerProposal.h"
+ #include "src/cpp/ripple/ripple_AcceptedLedgerTx.h"
+ #include "src/cpp/ripple/NetworkOPs.h"
+ #include "src/cpp/ripple/ripple_IApplication.h"
+
+#include "src/cpp/ripple/ripple_InfoSub.cpp"
+//#include "src/cpp/ripple/NetworkOPs.cpp"
diff --git a/modules/ripple_client/ripple_client.h b/modules/ripple_client/ripple_client.h
index 4c069d433e..dcc19bfd7d 100644
--- a/modules/ripple_client/ripple_client.h
+++ b/modules/ripple_client/ripple_client.h
@@ -32,6 +32,4 @@
#ifndef RIPPLE_CLIENT_H
#define RIPPLE_CLIENT_H
-#include "modules/ripple_basics/ripple_basics.h"
-
#endif
diff --git a/modules/ripple_data/protocol/ripple_LedgerFormat.cpp b/modules/ripple_data/protocol/ripple_LedgerFormat.cpp
index e46a08242c..cc799e6ecc 100644
--- a/modules/ripple_data/protocol/ripple_LedgerFormat.cpp
+++ b/modules/ripple_data/protocol/ripple_LedgerFormat.cpp
@@ -3,8 +3,6 @@ std::map LedgerEntryFormat::byType;
std::map LedgerEntryFormat::byName;
-// VFALCO TODO surely we can think of a better way than macros?
-
#define LEF_BASE \
<< SOElement(sfLedgerIndex, SOE_OPTIONAL) \
<< SOElement(sfLedgerEntryType, SOE_REQUIRED) \
diff --git a/modules/ripple_data/protocol/ripple_RippleAddress.cpp b/modules/ripple_data/protocol/ripple_RippleAddress.cpp
index 924be45a4c..a935734c11 100644
--- a/modules/ripple_data/protocol/ripple_RippleAddress.cpp
+++ b/modules/ripple_data/protocol/ripple_RippleAddress.cpp
@@ -1,13 +1,8 @@
-
-// VFALCO TODO remove this when it's safe to do so.
-#ifdef __APPLICATION__
-#error Including Application.h is disallowed!
-#endif
-
SETUP_LOG (RippleAddress)
-RippleAddress::RippleAddress() : mIsValid(false)
+RippleAddress::RippleAddress ()
+ : mIsValid (false)
{
nVersion = VER_NONE;
}
diff --git a/modules/ripple_data/protocol/ripple_SerializedObject.cpp b/modules/ripple_data/protocol/ripple_SerializedObject.cpp
index f4b7c362c4..b440510e75 100644
--- a/modules/ripple_data/protocol/ripple_SerializedObject.cpp
+++ b/modules/ripple_data/protocol/ripple_SerializedObject.cpp
@@ -1021,13 +1021,13 @@ UPTR_T STObject::parseJson(const Json::Value& object, SField::ref inNa
else if (value.isInt())
{
if (value.asInt() < 0 || value.asInt() > 255)
- throw std::runtime_error("value out of rand");
+ throw std::runtime_error("value out of range");
data.push_back(new STUInt8(field, range_check_cast(value.asInt(), 0, 255)));
}
else if (value.isUInt())
{
if (value.asUInt() > 255)
- throw std::runtime_error("value out of rand");
+ throw std::runtime_error("value out of range");
data.push_back(new STUInt8(field, range_check_cast(value.asUInt(), 0, 255)));
}
else
diff --git a/modules/ripple_data/protocol/ripple_SerializedTypes.h b/modules/ripple_data/protocol/ripple_SerializedTypes.h
index ae5aafec84..a55ecc074d 100644
--- a/modules/ripple_data/protocol/ripple_SerializedTypes.h
+++ b/modules/ripple_data/protocol/ripple_SerializedTypes.h
@@ -30,7 +30,7 @@ static const uint160 u160_zero(0), u160_one(1);
static inline const uint160& get_u160_zero() { return u160_zero; }
static inline const uint160& get_u160_one() { return u160_one; }
-// VFALCO TODO replace these with language constructs, gah!
+// VFALCO TODO replace these with language constructs
#define CURRENCY_XRP get_u160_zero()
#define CURRENCY_ONE get_u160_one() // Used as a place holder.
#define CURRENCY_BAD uint160(0x5852500000000000) // Do not allow XRP as an IOU currency.
diff --git a/modules/ripple_data/ripple_data.h b/modules/ripple_data/ripple_data.h
index 14b687c4c0..cb899428ee 100644
--- a/modules/ripple_data/ripple_data.h
+++ b/modules/ripple_data/ripple_data.h
@@ -57,6 +57,15 @@
// VFALCO TODO try to reduce these dependencies
#include "../ripple_basics/ripple_basics.h"
+//------------------------------------------------------------------------------
+
+// VFALCO TODO prepare a unity header for LevelDB
+// VFALCO TODO don't expose leveldb throughout the headers
+#include "leveldb/cache.h"
+#include "leveldb/filter_policy.h"
+#include "leveldb/db.h"
+#include "leveldb/write_batch.h"
+
// VFALCO TODO figure out a good place for this file, perhaps give it some
// additional hierarchy via directories.
#include "ripple.pb.h"
diff --git a/modules/ripple_main/ripple_main.cpp b/modules/ripple_main/ripple_main.cpp
index 249c84830f..0f72e445a1 100644
--- a/modules/ripple_main/ripple_main.cpp
+++ b/modules/ripple_main/ripple_main.cpp
@@ -34,11 +34,14 @@
#include
#include
#include