diff options
author | Roxanne Skelly <roxie@lindenlab.com> | 2024-05-20 14:36:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-20 14:36:14 -0700 |
commit | a1d7d2abc304b59fbca26f0ca23c926762be10a1 (patch) | |
tree | fcb3901b838af753e40c2ddd1ce84b95a6c2f603 /indra/llcommon/llsd.cpp | |
parent | f51797f088808029745161854aa86b775f041a64 (diff) | |
parent | 3a212d9608492ae64a3a32f80790371b90be9e9e (diff) |
Merge pull request #1532 from secondlife/roxie/webrtc-voice
[WebRTC] Merge from main
Diffstat (limited to 'indra/llcommon/llsd.cpp')
-rw-r--r-- | indra/llcommon/llsd.cpp | 1524 |
1 files changed, 762 insertions, 762 deletions
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 590915e9d2..663ceac22b 100644 --- a/indra/llcommon/llsd.cpp +++ b/indra/llcommon/llsd.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llsd.cpp * @brief LLSD flexible data system * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -53,13 +53,13 @@ bool was_negative(size_t i) #endif #ifdef NAME_UNNAMED_NAMESPACE -namespace LLSDUnnamedNamespace +namespace LLSDUnnamedNamespace #else -namespace +namespace #endif { - class ImplMap; - class ImplArray; + class ImplMap; + class ImplArray; } #ifdef NAME_UNNAMED_NAMESPACE @@ -70,740 +70,740 @@ namespace llsd { // statics -S32 sLLSDAllocationCount = 0; +S32 sLLSDAllocationCount = 0; S32 sLLSDNetObjects = 0; } // namespace llsd -#define ALLOC_LLSD_OBJECT { llsd::sLLSDNetObjects++; llsd::sLLSDAllocationCount++; } -#define FREE_LLSD_OBJECT { llsd::sLLSDNetObjects--; } +#define ALLOC_LLSD_OBJECT { llsd::sLLSDNetObjects++; llsd::sLLSDAllocationCount++; } +#define FREE_LLSD_OBJECT { llsd::sLLSDNetObjects--; } class LLSD::Impl - /**< This class is the abstract base class of the implementation of LLSD - It provides the reference counting implementation, and the default - implementation of most methods for most data types. It also serves - as a working implementation of the Undefined type. - - */ + /**< This class is the abstract base class of the implementation of LLSD + It provides the reference counting implementation, and the default + implementation of most methods for most data types. It also serves + as a working implementation of the Undefined type. + + */ { protected: - Impl(); - - enum StaticAllocationMarker { STATIC_USAGE_COUNT = 0xFFFFFFFF }; - Impl(StaticAllocationMarker); - ///< This constructor is used for static objects and causes the - // suppresses adjusting the debugging counters when they are - // finally initialized. - - virtual ~Impl(); - - bool shared() const { return (mUseCount > 1) && (mUseCount != STATIC_USAGE_COUNT); } - - U32 mUseCount; + Impl(); + + enum StaticAllocationMarker { STATIC_USAGE_COUNT = 0xFFFFFFFF }; + Impl(StaticAllocationMarker); + ///< This constructor is used for static objects and causes the + // suppresses adjusting the debugging counters when they are + // finally initialized. + + virtual ~Impl(); + + bool shared() const { return (mUseCount > 1) && (mUseCount != STATIC_USAGE_COUNT); } + + U32 mUseCount; public: - static void reset(Impl*& var, Impl* impl); - ///< safely set var to refer to the new impl (possibly shared) - - static Impl& safe( Impl*); - static const Impl& safe(const Impl*); - ///< since a NULL Impl* is used for undefined, this ensures there is - // always an object you call virtual member functions on - - virtual ImplMap& makeMap(Impl*& var); - virtual ImplArray& makeArray(Impl*& var); - ///< sure var is a modifiable, non-shared map or array - - virtual LLSD::Type type() const { return LLSD::TypeUndefined; } - - static void assignUndefined(LLSD::Impl*& var); - static void assign(LLSD::Impl*& var, const LLSD::Impl* other); - - virtual void assign(Impl*& var, LLSD::Boolean); - virtual void assign(Impl*& var, LLSD::Integer); - virtual void assign(Impl*& var, LLSD::Real); - virtual void assign(Impl*& var, const LLSD::String&); - virtual void assign(Impl*& var, const LLSD::UUID&); - virtual void assign(Impl*& var, const LLSD::Date&); - virtual void assign(Impl*& var, const LLSD::URI&); - virtual void assign(Impl*& var, const LLSD::Binary&); - ///< If the receiver is the right type and unshared, these are simple - // data assignments, othewise the default implementation handless - // constructing the proper Impl subclass - - virtual Boolean asBoolean() const { return false; } - virtual Integer asInteger() const { return 0; } - virtual Real asReal() const { return 0.0; } - virtual String asString() const { return std::string(); } - virtual UUID asUUID() const { return LLUUID(); } - virtual Date asDate() const { return LLDate(); } - virtual URI asURI() const { return LLURI(); } - virtual const Binary& asBinary() const { static const std::vector<U8> empty; return empty; } - - virtual const String& asStringRef() const { static const std::string empty; return empty; } - - virtual bool has(const String&) const { return false; } - virtual LLSD get(const String&) const { return LLSD(); } - virtual LLSD getKeys() const { return LLSD::emptyArray(); } - virtual void erase(const String&) { } - virtual const LLSD& ref(const String&) const{ return undef(); } - - virtual size_t size() const { return 0; } - virtual LLSD get(size_t) const { return LLSD(); } - virtual void erase(size_t) { } - virtual const LLSD& ref(size_t) const { return undef(); } - - virtual LLSD::map_const_iterator beginMap() const { return endMap(); } - virtual LLSD::map_const_iterator endMap() const { static const std::map<String, LLSD> empty; return empty.end(); } - virtual LLSD::array_const_iterator beginArray() const { return endArray(); } - virtual LLSD::array_const_iterator endArray() const { static const std::vector<LLSD> empty; return empty.end(); } - - virtual void dumpStats() const; - virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; - // Container subclasses contain LLSD objects, rather than directly - // containing Impl objects. This helper forwards through LLSD. - void calcStats(const LLSD& llsd, S32 type_counts[], S32 share_counts[]) const - { - safe(llsd.impl).calcStats(type_counts, share_counts); - } - - static const Impl& getImpl(const LLSD& llsd) { return safe(llsd.impl); } - static Impl& getImpl(LLSD& llsd) { return safe(llsd.impl); } - - static const LLSD& undef(); - - static U32 sAllocationCount; - static U32 sOutstandingCount; + static void reset(Impl*& var, Impl* impl); + ///< safely set var to refer to the new impl (possibly shared) + + static Impl& safe( Impl*); + static const Impl& safe(const Impl*); + ///< since a NULL Impl* is used for undefined, this ensures there is + // always an object you call virtual member functions on + + virtual ImplMap& makeMap(Impl*& var); + virtual ImplArray& makeArray(Impl*& var); + ///< sure var is a modifiable, non-shared map or array + + virtual LLSD::Type type() const { return LLSD::TypeUndefined; } + + static void assignUndefined(LLSD::Impl*& var); + static void assign(LLSD::Impl*& var, const LLSD::Impl* other); + + virtual void assign(Impl*& var, LLSD::Boolean); + virtual void assign(Impl*& var, LLSD::Integer); + virtual void assign(Impl*& var, LLSD::Real); + virtual void assign(Impl*& var, const LLSD::String&); + virtual void assign(Impl*& var, const LLSD::UUID&); + virtual void assign(Impl*& var, const LLSD::Date&); + virtual void assign(Impl*& var, const LLSD::URI&); + virtual void assign(Impl*& var, const LLSD::Binary&); + ///< If the receiver is the right type and unshared, these are simple + // data assignments, othewise the default implementation handless + // constructing the proper Impl subclass + + virtual Boolean asBoolean() const { return false; } + virtual Integer asInteger() const { return 0; } + virtual Real asReal() const { return 0.0; } + virtual String asString() const { return std::string(); } + virtual UUID asUUID() const { return LLUUID(); } + virtual Date asDate() const { return LLDate(); } + virtual URI asURI() const { return LLURI(); } + virtual const Binary& asBinary() const { static const std::vector<U8> empty; return empty; } + + virtual const String& asStringRef() const { static const std::string empty; return empty; } + + virtual bool has(const String&) const { return false; } + virtual LLSD get(const String&) const { return LLSD(); } + virtual LLSD getKeys() const { return LLSD::emptyArray(); } + virtual void erase(const String&) { } + virtual const LLSD& ref(const String&) const{ return undef(); } + + virtual size_t size() const { return 0; } + virtual LLSD get(size_t) const { return LLSD(); } + virtual void erase(size_t) { } + virtual const LLSD& ref(size_t) const { return undef(); } + + virtual LLSD::map_const_iterator beginMap() const { return endMap(); } + virtual LLSD::map_const_iterator endMap() const { static const std::map<String, LLSD> empty; return empty.end(); } + virtual LLSD::array_const_iterator beginArray() const { return endArray(); } + virtual LLSD::array_const_iterator endArray() const { static const std::vector<LLSD> empty; return empty.end(); } + + virtual void dumpStats() const; + virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; + // Container subclasses contain LLSD objects, rather than directly + // containing Impl objects. This helper forwards through LLSD. + void calcStats(const LLSD& llsd, S32 type_counts[], S32 share_counts[]) const + { + safe(llsd.impl).calcStats(type_counts, share_counts); + } + + static const Impl& getImpl(const LLSD& llsd) { return safe(llsd.impl); } + static Impl& getImpl(LLSD& llsd) { return safe(llsd.impl); } + + static const LLSD& undef(); + + static U32 sAllocationCount; + static U32 sOutstandingCount; }; #ifdef NAME_UNNAMED_NAMESPACE -namespace LLSDUnnamedNamespace +namespace LLSDUnnamedNamespace #else -namespace +namespace #endif { - template<LLSD::Type T, class Data, class DataRef = Data> - class ImplBase : public LLSD::Impl - ///< This class handles most of the work for a subclass of Impl - // for a given simple data type. Subclasses of this provide the - // conversion functions and a constructor. - { - protected: - Data mValue; - - typedef ImplBase Base; - - public: - ImplBase(DataRef value) : mValue(value) { } - - virtual LLSD::Type type() const { return T; } - - using LLSD::Impl::assign; // Unhiding base class virtuals... - virtual void assign(LLSD::Impl*& var, DataRef value) { - if (shared()) - { - Impl::assign(var, value); - } - else - { - mValue = value; - } - } - }; - - - class ImplBoolean - : public ImplBase<LLSD::TypeBoolean, LLSD::Boolean> - { - public: - ImplBoolean(LLSD::Boolean v) : Base(v) { } - - virtual LLSD::Boolean asBoolean() const { return mValue; } - virtual LLSD::Integer asInteger() const { return mValue ? 1 : 0; } - virtual LLSD::Real asReal() const { return mValue ? 1 : 0; } - virtual LLSD::String asString() const; - }; - - LLSD::String ImplBoolean::asString() const - // *NOTE: The reason that false is not converted to "false" is - // because that would break roundtripping, - // e.g. LLSD(false).asString().asBoolean(). There are many - // reasons for wanting LLSD("false").asBoolean() == true, such - // as "everything else seems to work that way". - { return mValue ? "true" : ""; } - - - class ImplInteger - : public ImplBase<LLSD::TypeInteger, LLSD::Integer> - { - public: - ImplInteger(LLSD::Integer v) : Base(v) { } - - virtual LLSD::Boolean asBoolean() const { return mValue != 0; } - virtual LLSD::Integer asInteger() const { return mValue; } - virtual LLSD::Real asReal() const { return mValue; } - virtual LLSD::String asString() const; - }; - - LLSD::String ImplInteger::asString() const - { return llformat("%d", mValue); } - - - class ImplReal - : public ImplBase<LLSD::TypeReal, LLSD::Real> - { - public: - ImplReal(LLSD::Real v) : Base(v) { } - - virtual LLSD::Boolean asBoolean() const; - virtual LLSD::Integer asInteger() const; - virtual LLSD::Real asReal() const { return mValue; } - virtual LLSD::String asString() const; - }; - - LLSD::Boolean ImplReal::asBoolean() const - { return !llisnan(mValue) && mValue != 0.0; } - - LLSD::Integer ImplReal::asInteger() const - { return !llisnan(mValue) ? (LLSD::Integer)mValue : 0; } - - LLSD::String ImplReal::asString() const - { return llformat("%lg", mValue); } - - - class ImplString - : public ImplBase<LLSD::TypeString, LLSD::String, const LLSD::String&> - { - public: - ImplString(const LLSD::String& v) : Base(v) { } - - virtual LLSD::Boolean asBoolean() const { return !mValue.empty(); } - virtual LLSD::Integer asInteger() const; - virtual LLSD::Real asReal() const; - virtual LLSD::String asString() const { return mValue; } - virtual LLSD::UUID asUUID() const { return LLUUID(mValue); } - virtual LLSD::Date asDate() const { return LLDate(mValue); } - virtual LLSD::URI asURI() const { return LLURI(mValue); } - virtual size_t size() const { return mValue.size(); } - virtual const LLSD::String& asStringRef() const { return mValue; } - }; - - LLSD::Integer ImplString::asInteger() const - { - // This must treat "1.23" not as an error, but as a number, which is - // then truncated down to an integer. Hence, this code doesn't call - // std::istringstream::operator>>(int&), which would not consume the - // ".23" portion. - - return (int)asReal(); - } - - LLSD::Real ImplString::asReal() const - { - F64 v = 0.0; - std::istringstream i_stream(mValue); - i_stream >> v; - - // we would probably like to ignore all trailing whitespace as - // well, but for now, simply eat the next character, and make - // sure we reached the end of the string. - // *NOTE: gcc 2.95 does not generate an eof() event on the - // stream operation above, so we manually get here to force it - // across platforms. - int c = i_stream.get(); - return ((EOF ==c) ? v : 0.0); - } - - - class ImplUUID - : public ImplBase<LLSD::TypeUUID, LLSD::UUID, const LLSD::UUID&> - { - public: - ImplUUID(const LLSD::UUID& v) : Base(v) { } - - virtual LLSD::String asString() const{ return mValue.asString(); } - virtual LLSD::UUID asUUID() const { return mValue; } - }; - - - class ImplDate - : public ImplBase<LLSD::TypeDate, LLSD::Date, const LLSD::Date&> - { - public: - ImplDate(const LLSD::Date& v) - : ImplBase<LLSD::TypeDate, LLSD::Date, const LLSD::Date&>(v) - { } - - virtual LLSD::Integer asInteger() const - { - return (LLSD::Integer)(mValue.secondsSinceEpoch()); - } - virtual LLSD::Real asReal() const - { - return mValue.secondsSinceEpoch(); - } - virtual LLSD::String asString() const{ return mValue.asString(); } - virtual LLSD::Date asDate() const { return mValue; } - }; - - - class ImplURI - : public ImplBase<LLSD::TypeURI, LLSD::URI, const LLSD::URI&> - { - public: - ImplURI(const LLSD::URI& v) : Base(v) { } - - virtual LLSD::String asString() const{ return mValue.asString(); } - virtual LLSD::URI asURI() const { return mValue; } - }; - - - class ImplBinary - : public ImplBase<LLSD::TypeBinary, LLSD::Binary, const LLSD::Binary&> - { - public: - ImplBinary(const LLSD::Binary& v) : Base(v) { } - - virtual const LLSD::Binary& asBinary() const{ return mValue; } - }; - - - class ImplMap : public LLSD::Impl - { - private: - typedef std::map<LLSD::String, LLSD> DataMap; - - DataMap mData; - - protected: - ImplMap(const DataMap& data) : mData(data) { } - - public: - ImplMap() { } - - virtual ImplMap& makeMap(LLSD::Impl*&); - - virtual LLSD::Type type() const { return LLSD::TypeMap; } - - virtual LLSD::Boolean asBoolean() const { return !mData.empty(); } - - virtual bool has(const LLSD::String&) const; - - using LLSD::Impl::get; // Unhiding get(size_t) - using LLSD::Impl::erase; // Unhiding erase(size_t) - using LLSD::Impl::ref; // Unhiding ref(size_t) - virtual LLSD get(const LLSD::String&) const; - virtual LLSD getKeys() const; - void insert(const LLSD::String& k, const LLSD& v); - virtual void erase(const LLSD::String&); - LLSD& ref(const LLSD::String&); - virtual const LLSD& ref(const LLSD::String&) const; - - virtual size_t size() const { return mData.size(); } - - LLSD::map_iterator beginMap() { return mData.begin(); } - LLSD::map_iterator endMap() { return mData.end(); } - virtual LLSD::map_const_iterator beginMap() const { return mData.begin(); } - virtual LLSD::map_const_iterator endMap() const { return mData.end(); } - - virtual void dumpStats() const; - virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; - }; - - ImplMap& ImplMap::makeMap(LLSD::Impl*& var) - { + template<LLSD::Type T, class Data, class DataRef = Data> + class ImplBase : public LLSD::Impl + ///< This class handles most of the work for a subclass of Impl + // for a given simple data type. Subclasses of this provide the + // conversion functions and a constructor. + { + protected: + Data mValue; + + typedef ImplBase Base; + + public: + ImplBase(DataRef value) : mValue(value) { } + + virtual LLSD::Type type() const { return T; } + + using LLSD::Impl::assign; // Unhiding base class virtuals... + virtual void assign(LLSD::Impl*& var, DataRef value) { + if (shared()) + { + Impl::assign(var, value); + } + else + { + mValue = value; + } + } + }; + + + class ImplBoolean + : public ImplBase<LLSD::TypeBoolean, LLSD::Boolean> + { + public: + ImplBoolean(LLSD::Boolean v) : Base(v) { } + + virtual LLSD::Boolean asBoolean() const { return mValue; } + virtual LLSD::Integer asInteger() const { return mValue ? 1 : 0; } + virtual LLSD::Real asReal() const { return mValue ? 1 : 0; } + virtual LLSD::String asString() const; + }; + + LLSD::String ImplBoolean::asString() const + // *NOTE: The reason that false is not converted to "false" is + // because that would break roundtripping, + // e.g. LLSD(false).asString().asBoolean(). There are many + // reasons for wanting LLSD("false").asBoolean() == true, such + // as "everything else seems to work that way". + { return mValue ? "true" : ""; } + + + class ImplInteger + : public ImplBase<LLSD::TypeInteger, LLSD::Integer> + { + public: + ImplInteger(LLSD::Integer v) : Base(v) { } + + virtual LLSD::Boolean asBoolean() const { return mValue != 0; } + virtual LLSD::Integer asInteger() const { return mValue; } + virtual LLSD::Real asReal() const { return mValue; } + virtual LLSD::String asString() const; + }; + + LLSD::String ImplInteger::asString() const + { return llformat("%d", mValue); } + + + class ImplReal + : public ImplBase<LLSD::TypeReal, LLSD::Real> + { + public: + ImplReal(LLSD::Real v) : Base(v) { } + + virtual LLSD::Boolean asBoolean() const; + virtual LLSD::Integer asInteger() const; + virtual LLSD::Real asReal() const { return mValue; } + virtual LLSD::String asString() const; + }; + + LLSD::Boolean ImplReal::asBoolean() const + { return !llisnan(mValue) && mValue != 0.0; } + + LLSD::Integer ImplReal::asInteger() const + { return !llisnan(mValue) ? (LLSD::Integer)mValue : 0; } + + LLSD::String ImplReal::asString() const + { return llformat("%lg", mValue); } + + + class ImplString + : public ImplBase<LLSD::TypeString, LLSD::String, const LLSD::String&> + { + public: + ImplString(const LLSD::String& v) : Base(v) { } + + virtual LLSD::Boolean asBoolean() const { return !mValue.empty(); } + virtual LLSD::Integer asInteger() const; + virtual LLSD::Real asReal() const; + virtual LLSD::String asString() const { return mValue; } + virtual LLSD::UUID asUUID() const { return LLUUID(mValue); } + virtual LLSD::Date asDate() const { return LLDate(mValue); } + virtual LLSD::URI asURI() const { return LLURI(mValue); } + virtual size_t size() const { return mValue.size(); } + virtual const LLSD::String& asStringRef() const { return mValue; } + }; + + LLSD::Integer ImplString::asInteger() const + { + // This must treat "1.23" not as an error, but as a number, which is + // then truncated down to an integer. Hence, this code doesn't call + // std::istringstream::operator>>(int&), which would not consume the + // ".23" portion. + + return (int)asReal(); + } + + LLSD::Real ImplString::asReal() const + { + F64 v = 0.0; + std::istringstream i_stream(mValue); + i_stream >> v; + + // we would probably like to ignore all trailing whitespace as + // well, but for now, simply eat the next character, and make + // sure we reached the end of the string. + // *NOTE: gcc 2.95 does not generate an eof() event on the + // stream operation above, so we manually get here to force it + // across platforms. + int c = i_stream.get(); + return ((EOF ==c) ? v : 0.0); + } + + + class ImplUUID + : public ImplBase<LLSD::TypeUUID, LLSD::UUID, const LLSD::UUID&> + { + public: + ImplUUID(const LLSD::UUID& v) : Base(v) { } + + virtual LLSD::String asString() const{ return mValue.asString(); } + virtual LLSD::UUID asUUID() const { return mValue; } + }; + + + class ImplDate + : public ImplBase<LLSD::TypeDate, LLSD::Date, const LLSD::Date&> + { + public: + ImplDate(const LLSD::Date& v) + : ImplBase<LLSD::TypeDate, LLSD::Date, const LLSD::Date&>(v) + { } + + virtual LLSD::Integer asInteger() const + { + return (LLSD::Integer)(mValue.secondsSinceEpoch()); + } + virtual LLSD::Real asReal() const + { + return mValue.secondsSinceEpoch(); + } + virtual LLSD::String asString() const{ return mValue.asString(); } + virtual LLSD::Date asDate() const { return mValue; } + }; + + + class ImplURI + : public ImplBase<LLSD::TypeURI, LLSD::URI, const LLSD::URI&> + { + public: + ImplURI(const LLSD::URI& v) : Base(v) { } + + virtual LLSD::String asString() const{ return mValue.asString(); } + virtual LLSD::URI asURI() const { return mValue; } + }; + + + class ImplBinary + : public ImplBase<LLSD::TypeBinary, LLSD::Binary, const LLSD::Binary&> + { + public: + ImplBinary(const LLSD::Binary& v) : Base(v) { } + + virtual const LLSD::Binary& asBinary() const{ return mValue; } + }; + + + class ImplMap : public LLSD::Impl + { + private: + typedef std::map<LLSD::String, LLSD> DataMap; + + DataMap mData; + + protected: + ImplMap(const DataMap& data) : mData(data) { } + + public: + ImplMap() { } + + virtual ImplMap& makeMap(LLSD::Impl*&); + + virtual LLSD::Type type() const { return LLSD::TypeMap; } + + virtual LLSD::Boolean asBoolean() const { return !mData.empty(); } + + virtual bool has(const LLSD::String&) const; + + using LLSD::Impl::get; // Unhiding get(size_t) + using LLSD::Impl::erase; // Unhiding erase(size_t) + using LLSD::Impl::ref; // Unhiding ref(size_t) + virtual LLSD get(const LLSD::String&) const; + virtual LLSD getKeys() const; + void insert(const LLSD::String& k, const LLSD& v); + virtual void erase(const LLSD::String&); + LLSD& ref(const LLSD::String&); + virtual const LLSD& ref(const LLSD::String&) const; + + virtual size_t size() const { return mData.size(); } + + LLSD::map_iterator beginMap() { return mData.begin(); } + LLSD::map_iterator endMap() { return mData.end(); } + virtual LLSD::map_const_iterator beginMap() const { return mData.begin(); } + virtual LLSD::map_const_iterator endMap() const { return mData.end(); } + + virtual void dumpStats() const; + virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; + }; + + ImplMap& ImplMap::makeMap(LLSD::Impl*& var) + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - if (shared()) - { - ImplMap* i = new ImplMap(mData); - Impl::assign(var, i); - return *i; - } - else - { - return *this; - } - } - - bool ImplMap::has(const LLSD::String& k) const - { + if (shared()) + { + ImplMap* i = new ImplMap(mData); + Impl::assign(var, i); + return *i; + } + else + { + return *this; + } + } + + bool ImplMap::has(const LLSD::String& k) const + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - DataMap::const_iterator i = mData.find(k); - return i != mData.end(); - } - - LLSD ImplMap::get(const LLSD::String& k) const - { + DataMap::const_iterator i = mData.find(k); + return i != mData.end(); + } + + LLSD ImplMap::get(const LLSD::String& k) const + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - DataMap::const_iterator i = mData.find(k); - return (i != mData.end()) ? i->second : LLSD(); - } + DataMap::const_iterator i = mData.find(k); + return (i != mData.end()) ? i->second : LLSD(); + } - LLSD ImplMap::getKeys() const - { + LLSD ImplMap::getKeys() const + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - LLSD keys = LLSD::emptyArray(); - DataMap::const_iterator iter = mData.begin(); - while (iter != mData.end()) - { - keys.append((*iter).first); - iter++; - } - return keys; - } - - void ImplMap::insert(const LLSD::String& k, const LLSD& v) - { + LLSD keys = LLSD::emptyArray(); + DataMap::const_iterator iter = mData.begin(); + while (iter != mData.end()) + { + keys.append((*iter).first); + iter++; + } + return keys; + } + + void ImplMap::insert(const LLSD::String& k, const LLSD& v) + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - mData.insert(DataMap::value_type(k, v)); - } - - void ImplMap::erase(const LLSD::String& k) - { + mData.insert(DataMap::value_type(k, v)); + } + + void ImplMap::erase(const LLSD::String& k) + { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - mData.erase(k); - } - - LLSD& ImplMap::ref(const LLSD::String& k) - { - return mData[k]; - } - - const LLSD& ImplMap::ref(const LLSD::String& k) const - { - DataMap::const_iterator i = mData.lower_bound(k); - if (i == mData.end() || mData.key_comp()(k, i->first)) - { - return undef(); - } - - return i->second; - } - - void ImplMap::dumpStats() const - { - std::cout << "Map size: " << mData.size() << std::endl; - - std::cout << "LLSD Net Objects: " << llsd::sLLSDNetObjects << std::endl; - std::cout << "LLSD allocations: " << llsd::sLLSDAllocationCount << std::endl; - - std::cout << "LLSD::Impl Net Objects: " << sOutstandingCount << std::endl; - std::cout << "LLSD::Impl allocations: " << sAllocationCount << std::endl; - - Impl::dumpStats(); - } - - void ImplMap::calcStats(S32 type_counts[], S32 share_counts[]) const - { - LLSD::map_const_iterator iter = beginMap(); - while (iter != endMap()) - { - //std::cout << " " << (*iter).first << ": " << (*iter).second << std::endl; - Impl::calcStats((*iter).second, type_counts, share_counts); - iter++; - } - - // Add in the values for this map - Impl::calcStats(type_counts, share_counts); - } - - - class ImplArray : public LLSD::Impl - { - private: - typedef std::vector<LLSD> DataVector; - - DataVector mData; - - protected: - ImplArray(const DataVector& data) : mData(data) { } - - public: - ImplArray() { } - - virtual ImplArray& makeArray(Impl*&); - - virtual LLSD::Type type() const { return LLSD::TypeArray; } - - virtual LLSD::Boolean asBoolean() const { return !mData.empty(); } - - using LLSD::Impl::get; // Unhiding get(LLSD::String) - using LLSD::Impl::erase; // Unhiding erase(LLSD::String) - using LLSD::Impl::ref; // Unhiding ref(LLSD::String) - virtual size_t size() const; - virtual LLSD get(size_t) const; - void set(size_t, const LLSD&); - void insert(size_t, const LLSD&); - LLSD& append(const LLSD&); - virtual void erase(size_t); - LLSD& ref(size_t); - virtual const LLSD& ref(size_t) const; - - LLSD::array_iterator beginArray() { return mData.begin(); } - LLSD::array_iterator endArray() { return mData.end(); } - LLSD::reverse_array_iterator rbeginArray() { return mData.rbegin(); } - LLSD::reverse_array_iterator rendArray() { return mData.rend(); } - virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); } - virtual LLSD::array_const_iterator endArray() const { return mData.end(); } - - virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; - }; - - ImplArray& ImplArray::makeArray(Impl*& var) - { - if (shared()) - { - ImplArray* i = new ImplArray(mData); - Impl::assign(var, i); - return *i; - } - else - { - return *this; - } - } - - size_t ImplArray::size() const { return mData.size(); } - - LLSD ImplArray::get(size_t i) const - { - NEGATIVE_RETURN(i, LLSD()); - DataVector::size_type index = i; - - return (index < mData.size()) ? mData[index] : LLSD(); - } - - void ImplArray::set(size_t i, const LLSD& v) - { - NEGATIVE_EXIT(i); - DataVector::size_type index = i; - - if (index >= mData.size()) - { - mData.resize(index + 1); - } - - mData[index] = v; - } - - void ImplArray::insert(size_t i, const LLSD& v) - { - NEGATIVE_EXIT(i); - DataVector::size_type index = i; - - if (index >= mData.size()) // tbd - sanity check limit for index ? - { - mData.resize(index + 1); - } - - mData.insert(mData.begin() + index, v); - } - - LLSD& ImplArray::append(const LLSD& v) - { - mData.push_back(v); - return mData.back(); - } - - void ImplArray::erase(size_t i) - { - NEGATIVE_EXIT(i); - DataVector::size_type index = i; - - if (index < mData.size()) - { - mData.erase(mData.begin() + index); - } - } - - LLSD& ImplArray::ref(size_t i) - { - DataVector::size_type index = was_negative(i)? 0 : i; - - if (index >= mData.size()) - { - mData.resize(index + 1); - } - - return mData[index]; - } - - const LLSD& ImplArray::ref(size_t i) const - { - NEGATIVE_RETURN(i, undef()); - DataVector::size_type index = i; - - if (index >= mData.size()) - { - return undef(); - } - - return mData[index]; - } - - void ImplArray::calcStats(S32 type_counts[], S32 share_counts[]) const - { - LLSD::array_const_iterator iter = beginArray(); - while (iter != endArray()) - { // Add values for all items held in the array - Impl::calcStats((*iter), type_counts, share_counts); - iter++; - } - - // Add in the values for this array - Impl::calcStats(type_counts, share_counts); - } + mData.erase(k); + } + + LLSD& ImplMap::ref(const LLSD::String& k) + { + return mData[k]; + } + + const LLSD& ImplMap::ref(const LLSD::String& k) const + { + DataMap::const_iterator i = mData.lower_bound(k); + if (i == mData.end() || mData.key_comp()(k, i->first)) + { + return undef(); + } + + return i->second; + } + + void ImplMap::dumpStats() const + { + std::cout << "Map size: " << mData.size() << std::endl; + + std::cout << "LLSD Net Objects: " << llsd::sLLSDNetObjects << std::endl; + std::cout << "LLSD allocations: " << llsd::sLLSDAllocationCount << std::endl; + + std::cout << "LLSD::Impl Net Objects: " << sOutstandingCount << std::endl; + std::cout << "LLSD::Impl allocations: " << sAllocationCount << std::endl; + + Impl::dumpStats(); + } + + void ImplMap::calcStats(S32 type_counts[], S32 share_counts[]) const + { + LLSD::map_const_iterator iter = beginMap(); + while (iter != endMap()) + { + //std::cout << " " << (*iter).first << ": " << (*iter).second << std::endl; + Impl::calcStats((*iter).second, type_counts, share_counts); + iter++; + } + + // Add in the values for this map + Impl::calcStats(type_counts, share_counts); + } + + + class ImplArray : public LLSD::Impl + { + private: + typedef std::vector<LLSD> DataVector; + + DataVector mData; + + protected: + ImplArray(const DataVector& data) : mData(data) { } + + public: + ImplArray() { } + + virtual ImplArray& makeArray(Impl*&); + + virtual LLSD::Type type() const { return LLSD::TypeArray; } + + virtual LLSD::Boolean asBoolean() const { return !mData.empty(); } + + using LLSD::Impl::get; // Unhiding get(LLSD::String) + using LLSD::Impl::erase; // Unhiding erase(LLSD::String) + using LLSD::Impl::ref; // Unhiding ref(LLSD::String) + virtual size_t size() const; + virtual LLSD get(size_t) const; + void set(size_t, const LLSD&); + void insert(size_t, const LLSD&); + LLSD& append(const LLSD&); + virtual void erase(size_t); + LLSD& ref(size_t); + virtual const LLSD& ref(size_t) const; + + LLSD::array_iterator beginArray() { return mData.begin(); } + LLSD::array_iterator endArray() { return mData.end(); } + LLSD::reverse_array_iterator rbeginArray() { return mData.rbegin(); } + LLSD::reverse_array_iterator rendArray() { return mData.rend(); } + virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); } + virtual LLSD::array_const_iterator endArray() const { return mData.end(); } + + virtual void calcStats(S32 type_counts[], S32 share_counts[]) const; + }; + + ImplArray& ImplArray::makeArray(Impl*& var) + { + if (shared()) + { + ImplArray* i = new ImplArray(mData); + Impl::assign(var, i); + return *i; + } + else + { + return *this; + } + } + + size_t ImplArray::size() const { return mData.size(); } + + LLSD ImplArray::get(size_t i) const + { + NEGATIVE_RETURN(i, LLSD()); + DataVector::size_type index = i; + + return (index < mData.size()) ? mData[index] : LLSD(); + } + + void ImplArray::set(size_t i, const LLSD& v) + { + NEGATIVE_EXIT(i); + DataVector::size_type index = i; + + if (index >= mData.size()) + { + mData.resize(index + 1); + } + + mData[index] = v; + } + + void ImplArray::insert(size_t i, const LLSD& v) + { + NEGATIVE_EXIT(i); + DataVector::size_type index = i; + + if (index >= mData.size()) // tbd - sanity check limit for index ? + { + mData.resize(index + 1); + } + + mData.insert(mData.begin() + index, v); + } + + LLSD& ImplArray::append(const LLSD& v) + { + mData.push_back(v); + return mData.back(); + } + + void ImplArray::erase(size_t i) + { + NEGATIVE_EXIT(i); + DataVector::size_type index = i; + + if (index < mData.size()) + { + mData.erase(mData.begin() + index); + } + } + + LLSD& ImplArray::ref(size_t i) + { + DataVector::size_type index = was_negative(i)? 0 : i; + + if (index >= mData.size()) + { + mData.resize(index + 1); + } + + return mData[index]; + } + + const LLSD& ImplArray::ref(size_t i) const + { + NEGATIVE_RETURN(i, undef()); + DataVector::size_type index = i; + + if (index >= mData.size()) + { + return undef(); + } + + return mData[index]; + } + + void ImplArray::calcStats(S32 type_counts[], S32 share_counts[]) const + { + LLSD::array_const_iterator iter = beginArray(); + while (iter != endArray()) + { // Add values for all items held in the array + Impl::calcStats((*iter), type_counts, share_counts); + iter++; + } + + // Add in the values for this array + Impl::calcStats(type_counts, share_counts); + } } LLSD::Impl::Impl() - : mUseCount(0) + : mUseCount(0) { - ++sAllocationCount; - ++sOutstandingCount; + ++sAllocationCount; + ++sOutstandingCount; } LLSD::Impl::Impl(StaticAllocationMarker) - : mUseCount(0) + : mUseCount(0) { } LLSD::Impl::~Impl() { - --sOutstandingCount; + --sOutstandingCount; } void LLSD::Impl::reset(Impl*& var, Impl* impl) { - if (impl && impl->mUseCount != STATIC_USAGE_COUNT) - { - ++impl->mUseCount; - } - if (var && var->mUseCount != STATIC_USAGE_COUNT && --var->mUseCount == 0) - { - delete var; - } - var = impl; + if (impl && impl->mUseCount != STATIC_USAGE_COUNT) + { + ++impl->mUseCount; + } + if (var && var->mUseCount != STATIC_USAGE_COUNT && --var->mUseCount == 0) + { + delete var; + } + var = impl; } LLSD::Impl& LLSD::Impl::safe(Impl* impl) { - static Impl theUndefined(STATIC_USAGE_COUNT); - return impl ? *impl : theUndefined; + static Impl theUndefined(STATIC_USAGE_COUNT); + return impl ? *impl : theUndefined; } const LLSD::Impl& LLSD::Impl::safe(const Impl* impl) { - static Impl theUndefined(STATIC_USAGE_COUNT); - return impl ? *impl : theUndefined; + static Impl theUndefined(STATIC_USAGE_COUNT); + return impl ? *impl : theUndefined; } ImplMap& LLSD::Impl::makeMap(Impl*& var) { LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - ImplMap* im = new ImplMap; - reset(var, im); - return *im; + ImplMap* im = new ImplMap; + reset(var, im); + return *im; } ImplArray& LLSD::Impl::makeArray(Impl*& var) { - ImplArray* ia = new ImplArray; - reset(var, ia); - return *ia; + ImplArray* ia = new ImplArray; + reset(var, ia); + return *ia; } void LLSD::Impl::assign(Impl*& var, const Impl* other) { - reset(var, const_cast<Impl*>(other)); + reset(var, const_cast<Impl*>(other)); } void LLSD::Impl::assignUndefined(Impl*& var) { - reset(var, 0); + reset(var, 0); } void LLSD::Impl::assign(Impl*& var, LLSD::Boolean v) { - reset(var, new ImplBoolean(v)); + reset(var, new ImplBoolean(v)); } void LLSD::Impl::assign(Impl*& var, LLSD::Integer v) { - reset(var, new ImplInteger(v)); + reset(var, new ImplInteger(v)); } void LLSD::Impl::assign(Impl*& var, LLSD::Real v) { - reset(var, new ImplReal(v)); + reset(var, new ImplReal(v)); } void LLSD::Impl::assign(Impl*& var, const LLSD::String& v) { - reset(var, new ImplString(v)); + reset(var, new ImplString(v)); } void LLSD::Impl::assign(Impl*& var, const LLSD::UUID& v) { - reset(var, new ImplUUID(v)); + reset(var, new ImplUUID(v)); } void LLSD::Impl::assign(Impl*& var, const LLSD::Date& v) { - reset(var, new ImplDate(v)); + reset(var, new ImplDate(v)); } void LLSD::Impl::assign(Impl*& var, const LLSD::URI& v) { - reset(var, new ImplURI(v)); + reset(var, new ImplURI(v)); } void LLSD::Impl::assign(Impl*& var, const LLSD::Binary& v) { - reset(var, new ImplBinary(v)); + reset(var, new ImplBinary(v)); } const LLSD& LLSD::Impl::undef() { - static const LLSD immutableUndefined; - return immutableUndefined; + static const LLSD immutableUndefined; + return immutableUndefined; } void LLSD::Impl::dumpStats() const { - S32 type_counts[LLSD::TypeLLSDNumTypes + 1]; - memset(&type_counts, 0, sizeof(type_counts)); - - S32 share_counts[LLSD::TypeLLSDNumTypes + 1]; - memset(&share_counts, 0, sizeof(share_counts)); - - // Add info from all the values this object has - calcStats(type_counts, share_counts); - - S32 type_index = LLSD::TypeLLSDTypeBegin; - while (type_index != LLSD::TypeLLSDTypeEnd) - { - std::cout << LLSD::typeString((LLSD::Type)type_index) << " type " - << type_counts[type_index] << " objects, " - << share_counts[type_index] << " shared" - << std::endl; - type_index++; - } + S32 type_counts[LLSD::TypeLLSDNumTypes + 1]; + memset(&type_counts, 0, sizeof(type_counts)); + + S32 share_counts[LLSD::TypeLLSDNumTypes + 1]; + memset(&share_counts, 0, sizeof(share_counts)); + + // Add info from all the values this object has + calcStats(type_counts, share_counts); + + S32 type_index = LLSD::TypeLLSDTypeBegin; + while (type_index != LLSD::TypeLLSDTypeEnd) + { + std::cout << LLSD::typeString((LLSD::Type)type_index) << " type " + << type_counts[type_index] << " objects, " + << share_counts[type_index] << " shared" + << std::endl; + type_index++; + } } void LLSD::Impl::calcStats(S32 type_counts[], S32 share_counts[]) const { - S32 tp = S32(type()); - if (0 <= tp && tp < LLSD::TypeLLSDNumTypes) - { - type_counts[tp]++; - if (shared()) - { - share_counts[tp]++; - } - } + S32 tp = S32(type()); + if (0 <= tp && tp < LLSD::TypeLLSDNumTypes) + { + type_counts[tp]++; + if (shared()) + { + share_counts[tp]++; + } + } } @@ -813,218 +813,218 @@ U32 LLSD::Impl::sOutstandingCount = 0; #ifdef NAME_UNNAMED_NAMESPACE -namespace LLSDUnnamedNamespace +namespace LLSDUnnamedNamespace #else -namespace +namespace #endif { - inline LLSD::Impl& safe(LLSD::Impl* impl) - { return LLSD::Impl::safe(impl); } - - inline ImplMap& makeMap(LLSD::Impl*& var) - { return safe(var).makeMap(var); } - - inline ImplArray& makeArray(LLSD::Impl*& var) - { return safe(var).makeArray(var); } + inline LLSD::Impl& safe(LLSD::Impl* impl) + { return LLSD::Impl::safe(impl); } + + inline ImplMap& makeMap(LLSD::Impl*& var) + { return safe(var).makeMap(var); } + + inline ImplArray& makeArray(LLSD::Impl*& var) + { return safe(var).makeArray(var); } } -LLSD::LLSD() : impl(0) { ALLOC_LLSD_OBJECT; } -LLSD::~LLSD() { FREE_LLSD_OBJECT; Impl::reset(impl, 0); } +LLSD::LLSD() : impl(0) { ALLOC_LLSD_OBJECT; } +LLSD::~LLSD() { FREE_LLSD_OBJECT; Impl::reset(impl, 0); } LLSD::LLSD(const LLSD& other) : impl(0) { ALLOC_LLSD_OBJECT; assign(other); } -void LLSD::assign(const LLSD& other) { Impl::assign(impl, other.impl); } +void LLSD::assign(const LLSD& other) { Impl::assign(impl, other.impl); } -void LLSD::clear() { Impl::assignUndefined(impl); } +void LLSD::clear() { Impl::assignUndefined(impl); } -LLSD::Type LLSD::type() const { return safe(impl).type(); } +LLSD::Type LLSD::type() const { return safe(impl).type(); } // Scalar Constructors -LLSD::LLSD(Boolean v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(Integer v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(Real v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(const UUID& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(const String& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(const Date& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(const URI& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } -LLSD::LLSD(const Binary& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(Boolean v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(Integer v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(Real v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const UUID& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const String& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const Date& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const URI& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const Binary& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } // Scalar Assignment -void LLSD::assign(Boolean v) { safe(impl).assign(impl, v); } -void LLSD::assign(Integer v) { safe(impl).assign(impl, v); } -void LLSD::assign(Real v) { safe(impl).assign(impl, v); } -void LLSD::assign(const String& v) { safe(impl).assign(impl, v); } -void LLSD::assign(const UUID& v) { safe(impl).assign(impl, v); } -void LLSD::assign(const Date& v) { safe(impl).assign(impl, v); } -void LLSD::assign(const URI& v) { safe(impl).assign(impl, v); } -void LLSD::assign(const Binary& v) { safe(impl).assign(impl, v); } +void LLSD::assign(Boolean v) { safe(impl).assign(impl, v); } +void LLSD::assign(Integer v) { safe(impl).assign(impl, v); } +void LLSD::assign(Real v) { safe(impl).assign(impl, v); } +void LLSD::assign(const String& v) { safe(impl).assign(impl, v); } +void LLSD::assign(const UUID& v) { safe(impl).assign(impl, v); } +void LLSD::assign(const Date& v) { safe(impl).assign(impl, v); } +void LLSD::assign(const URI& v) { safe(impl).assign(impl, v); } +void LLSD::assign(const Binary& v) { safe(impl).assign(impl, v); } // Scalar Accessors -LLSD::Boolean LLSD::asBoolean() const { return safe(impl).asBoolean(); } -LLSD::Integer LLSD::asInteger() const { return safe(impl).asInteger(); } -LLSD::Real LLSD::asReal() const { return safe(impl).asReal(); } -LLSD::String LLSD::asString() const { return safe(impl).asString(); } -LLSD::UUID LLSD::asUUID() const { return safe(impl).asUUID(); } -LLSD::Date LLSD::asDate() const { return safe(impl).asDate(); } -LLSD::URI LLSD::asURI() const { return safe(impl).asURI(); } -const LLSD::Binary& LLSD::asBinary() const { return safe(impl).asBinary(); } +LLSD::Boolean LLSD::asBoolean() const { return safe(impl).asBoolean(); } +LLSD::Integer LLSD::asInteger() const { return safe(impl).asInteger(); } +LLSD::Real LLSD::asReal() const { return safe(impl).asReal(); } +LLSD::String LLSD::asString() const { return safe(impl).asString(); } +LLSD::UUID LLSD::asUUID() const { return safe(impl).asUUID(); } +LLSD::Date LLSD::asDate() const { return safe(impl).asDate(); } +LLSD::URI LLSD::asURI() const { return safe(impl).asURI(); } +const LLSD::Binary& LLSD::asBinary() const { return safe(impl).asBinary(); } const LLSD::String& LLSD::asStringRef() const { return safe(impl).asStringRef(); } // const char * helpers -LLSD::LLSD(const char* v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } +LLSD::LLSD(const char* v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); } void LLSD::assign(const char* v) { - if(v) assign(std::string(v)); - else assign(std::string()); + if(v) assign(std::string(v)); + else assign(std::string()); } LLSD LLSD::emptyMap() { - LLSD v; - makeMap(v.impl); - return v; + LLSD v; + makeMap(v.impl); + return v; } -bool LLSD::has(const String& k) const { return safe(impl).has(k); } -LLSD LLSD::get(const String& k) const { return safe(impl).get(k); } -LLSD LLSD::getKeys() const { return safe(impl).getKeys(); } -void LLSD::insert(const String& k, const LLSD& v) { makeMap(impl).insert(k, v); } +bool LLSD::has(const String& k) const { return safe(impl).has(k); } +LLSD LLSD::get(const String& k) const { return safe(impl).get(k); } +LLSD LLSD::getKeys() const { return safe(impl).getKeys(); } +void LLSD::insert(const String& k, const LLSD& v) { makeMap(impl).insert(k, v); } LLSD& LLSD::with(const String& k, const LLSD& v) - { - makeMap(impl).insert(k, v); - return *this; - } -void LLSD::erase(const String& k) { makeMap(impl).erase(k); } + { + makeMap(impl).insert(k, v); + return *this; + } +void LLSD::erase(const String& k) { makeMap(impl).erase(k); } LLSD& LLSD::operator[](const String& k) -{ +{ LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - return makeMap(impl).ref(k); + return makeMap(impl).ref(k); } const LLSD& LLSD::operator[](const String& k) const -{ +{ LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - return safe(impl).ref(k); + return safe(impl).ref(k); } LLSD LLSD::emptyArray() { - LLSD v; - makeArray(v.impl); - return v; + LLSD v; + makeArray(v.impl); + return v; } -size_t LLSD::size() const { return safe(impl).size(); } - -LLSD LLSD::get(Integer i) const { return safe(impl).get(i); } +size_t LLSD::size() const { return safe(impl).size(); } + +LLSD LLSD::get(Integer i) const { return safe(impl).get(i); } void LLSD::set(Integer i, const LLSD& v){ makeArray(impl).set(i, v); } void LLSD::insert(Integer i, const LLSD& v) { makeArray(impl).insert(i, v); } LLSD& LLSD::with(Integer i, const LLSD& v) - { - makeArray(impl).insert(i, v); - return *this; - } -LLSD& LLSD::append(const LLSD& v) { return makeArray(impl).append(v); } -void LLSD::erase(Integer i) { makeArray(impl).erase(i); } + { + makeArray(impl).insert(i, v); + return *this; + } +LLSD& LLSD::append(const LLSD& v) { return makeArray(impl).append(v); } +void LLSD::erase(Integer i) { makeArray(impl).erase(i); } LLSD& LLSD::operator[](size_t i) -{ +{ LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; - return makeArray(impl).ref(i); + return makeArray(impl).ref(i); } const LLSD& LLSD::operator[](size_t i) const -{ +{ LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD; return safe(impl).ref(i); } static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat) { - // sStorage is used to hold the string representation of the llsd last - // passed into this function. If this function is never called (the - // normal case when not debugging), nothing is allocated. Otherwise - // sStorage will point to the result of the last call. This will actually - // be one leak, but since this is used only when running under the - // debugger, it should not be an issue. - static char *sStorage = NULL; - delete[] sStorage; - std::string out_string; - { - std::ostringstream out; - if (useXMLFormat) - out << LLSDXMLStreamer(llsd); - else - out << LLSDNotationStreamer(llsd); - out_string = out.str(); - } - auto len = out_string.length(); - sStorage = new char[len + 1]; - memcpy(sStorage, out_string.c_str(), len); - sStorage[len] = '\0'; - return sStorage; + // sStorage is used to hold the string representation of the llsd last + // passed into this function. If this function is never called (the + // normal case when not debugging), nothing is allocated. Otherwise + // sStorage will point to the result of the last call. This will actually + // be one leak, but since this is used only when running under the + // debugger, it should not be an issue. + static char *sStorage = NULL; + delete[] sStorage; + std::string out_string; + { + std::ostringstream out; + if (useXMLFormat) + out << LLSDXMLStreamer(llsd); + else + out << LLSDNotationStreamer(llsd); + out_string = out.str(); + } + auto len = out_string.length(); + sStorage = new char[len + 1]; + memcpy(sStorage, out_string.c_str(), len); + sStorage[len] = '\0'; + return sStorage; } /// Returns XML version of llsd -- only to be called from debugger const char *LLSD::dumpXML(const LLSD &llsd) { - return llsd_dump(llsd, true); + return llsd_dump(llsd, true); } /// Returns Notation version of llsd -- only to be called from debugger const char *LLSD::dump(const LLSD &llsd) { - return llsd_dump(llsd, false); + return llsd_dump(llsd, false); } -LLSD::map_iterator LLSD::beginMap() { return makeMap(impl).beginMap(); } -LLSD::map_iterator LLSD::endMap() { return makeMap(impl).endMap(); } -LLSD::map_const_iterator LLSD::beginMap() const { return safe(impl).beginMap(); } -LLSD::map_const_iterator LLSD::endMap() const { return safe(impl).endMap(); } +LLSD::map_iterator LLSD::beginMap() { return makeMap(impl).beginMap(); } +LLSD::map_iterator LLSD::endMap() { return makeMap(impl).endMap(); } +LLSD::map_const_iterator LLSD::beginMap() const { return safe(impl).beginMap(); } +LLSD::map_const_iterator LLSD::endMap() const { return safe(impl).endMap(); } -LLSD::array_iterator LLSD::beginArray() { return makeArray(impl).beginArray(); } -LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); } -LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); } -LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); } +LLSD::array_iterator LLSD::beginArray() { return makeArray(impl).beginArray(); } +LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); } +LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); } +LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); } -LLSD::reverse_array_iterator LLSD::rbeginArray() { return makeArray(impl).rbeginArray(); } -LLSD::reverse_array_iterator LLSD::rendArray() { return makeArray(impl).rendArray(); } +LLSD::reverse_array_iterator LLSD::rbeginArray() { return makeArray(impl).rbeginArray(); } +LLSD::reverse_array_iterator LLSD::rendArray() { return makeArray(impl).rendArray(); } namespace llsd { -U32 allocationCount() { return LLSD::Impl::sAllocationCount; } -U32 outstandingCount() { return LLSD::Impl::sOutstandingCount; } +U32 allocationCount() { return LLSD::Impl::sAllocationCount; } +U32 outstandingCount() { return LLSD::Impl::sOutstandingCount; } // Diagnostic dump of contents in an LLSD object -void dumpStats(const LLSD& llsd) { LLSD::Impl::getImpl(llsd).dumpStats(); } +void dumpStats(const LLSD& llsd) { LLSD::Impl::getImpl(llsd).dumpStats(); } } // namespace llsd // static -std::string LLSD::typeString(Type type) +std::string LLSD::typeString(Type type) { - static const char * sTypeNameArray[] = { - "Undefined", - "Boolean", - "Integer", - "Real", - "String", - "UUID", - "Date", - "URI", - "Binary", - "Map", - "Array" - }; - - if (0 <= type && type < LL_ARRAY_SIZE(sTypeNameArray)) - { - return sTypeNameArray[type]; - } - return STRINGIZE("** invalid type value " << type); + static const char * sTypeNameArray[] = { + "Undefined", + "Boolean", + "Integer", + "Real", + "String", + "UUID", + "Date", + "URI", + "Binary", + "Map", + "Array" + }; + + if (0 <= type && type < LL_ARRAY_SIZE(sTypeNameArray)) + { + return sTypeNameArray[type]; + } + return STRINGIZE("** invalid type value " << type); } |