Skip to content

Commit

Permalink
Implement the Array#reverse and String#reverse methods
Browse files Browse the repository at this point in the history
fixes #10197
  • Loading branch information
gunnarbeutner committed Oct 13, 2015
1 parent a530bb9 commit cd36ca2
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 1 deletion.
16 changes: 15 additions & 1 deletion doc/20-library-reference.md
Expand Up @@ -499,6 +499,14 @@ Signature:

Returns a copy of the string.

### <a id="string-reverse"></a> String#reverse

Signature:

function reverse();

Returns a copy of the string in reverse order.

## <a id="array-type"></a> Array type

### <a id="array-add"></a> Array#add
Expand Down Expand Up @@ -583,7 +591,13 @@ Signature:

Joins all elements of the array using the specified separator.

## <a id="dictionary-type"></a> Dictionary type
### <a id="array-reverse"></a> Array#reverse

Signature:

function reverse();

Returns a new array with all elements of the current array in reverse order.

### <a id="dictionary-clone"></a> Dictionary#clone

Expand Down
8 changes: 8 additions & 0 deletions lib/base/array-script.cpp
Expand Up @@ -130,6 +130,13 @@ static Value ArrayJoin(const Value& separator)
return result;
}

static Array::Ptr ArrayReverse(void)
{
ScriptFrame *vframe = ScriptFrame::GetCurrentFrame();
Array::Ptr self = static_cast<Array::Ptr>(vframe->Self);
return self->Reverse();
}

Object::Ptr Array::GetPrototype(void)
{
static Dictionary::Ptr prototype;
Expand All @@ -146,6 +153,7 @@ Object::Ptr Array::GetPrototype(void)
prototype->Set("sort", new Function(WrapFunction(ArraySort)));
prototype->Set("clone", new Function(WrapFunction(ArrayClone)));
prototype->Set("join", new Function(WrapFunction(ArrayJoin)));
prototype->Set("reverse", new Function(WrapFunction(ArrayReverse)));
}

return prototype;
Expand Down
11 changes: 11 additions & 0 deletions lib/base/array.cpp
Expand Up @@ -210,3 +210,14 @@ Array::Ptr Array::ShallowClone(void) const
return clone;
}

Array::Ptr Array::Reverse(void) const
{
Array::Ptr result = new Array();

ObjectLock olock(this);
ObjectLock xlock(result);

std::copy(m_Data.rbegin(), m_Data.rend(), std::back_inserter(result->m_Data));

return result;
}
2 changes: 2 additions & 0 deletions lib/base/array.hpp
Expand Up @@ -69,6 +69,8 @@ class I2_BASE_API Array : public Object

static Object::Ptr GetPrototype(void);

Array::Ptr Reverse(void) const;

private:
std::vector<Value> m_Data; /**< The data for the array. */
};
Expand Down
7 changes: 7 additions & 0 deletions lib/base/string-script.cpp
Expand Up @@ -126,6 +126,12 @@ static Value StringReplace(const String& search, const String& replacement)
return self;
}

static String StringReverse(void)
{
ScriptFrame *vframe = ScriptFrame::GetCurrentFrame();
String self = vframe->Self;
return self.Reverse();
}

Object::Ptr String::GetPrototype(void)
{
Expand All @@ -142,6 +148,7 @@ Object::Ptr String::GetPrototype(void)
prototype->Set("find", new Function(WrapFunction(StringFind)));
prototype->Set("contains", new Function(WrapFunction(StringContains)));
prototype->Set("replace", new Function(WrapFunction(StringReplace)));
prototype->Set("reverse", new Function(WrapFunction(StringReverse)));
}

return prototype;
Expand Down
7 changes: 7 additions & 0 deletions lib/base/string.hpp
Expand Up @@ -209,6 +209,13 @@ class I2_BASE_API String
m_Data.append(count, ch);
}

inline String Reverse(void) const
{
String t = m_Data;
std::reverse(t.m_Data.begin(), t.m_Data.end());
return t;
}

inline bool Contains(const String& str) const
{
return (m_Data.find(str) != std::string::npos);
Expand Down

0 comments on commit cd36ca2

Please sign in to comment.