void FieldRef::parse(const StringData& dottedField) { if (dottedField.size() == 0) { return; } if (_size != 0) { clear(); } // We guarantee that accesses through getPart() will be valid while 'this' is. So we // take a copy. We're going to be "chopping" up the copy into c-strings. _fieldBase.reset(new char[dottedField.size()+1]); dottedField.copyTo( _fieldBase.get(), true ); // Separate the field parts using '.' as a delimiter. char* beg = _fieldBase.get(); char* cur = beg; char* end = beg + dottedField.size(); while (true) { if (cur != end && *cur != '.') { cur++; continue; } appendPart(StringData(beg, cur - beg)); if (cur != end) { *cur = '\0'; beg = ++cur; continue; } break; } }
intrusive_ptr<const RCString> RCString::create(StringData s) { const size_t sizeWithNUL = s.size() + 1; const size_t bytesNeeded = sizeof(RCString) + sizeWithNUL; uassert(16493, str::stream() << "Tried to create string longer than " << (BSONObjMaxUserSize/1024/1024) << "MB", bytesNeeded < static_cast<size_t>(BSONObjMaxUserSize)); intrusive_ptr<RCString> ptr = new (bytesNeeded) RCString(); // uses custom operator new ptr->_size = s.size(); char* stringStart = reinterpret_cast<char*>(ptr.get()) + sizeof(RCString); s.copyTo( stringStart, true ); return ptr; }