|
|
|
|
[Struct/Class] String
|
|
Ty3uK | Дата: Четверг, 11 Октября 2012, 23:12:53 | Сообщение # 1 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Решил сделать подобие класса string, который есть в C# (точнее он много где есть, я взял за основу шарповый). Буду рад критике - алгоритмы не идеальны, код тоже. Можно скачать и посмотреть пример, я приложу его внизу. Code /************************************** * * String Class * v1.0 * By Max Karelov aka Ty3uK * * -Struct such as "string" class in C# * * Requirements: * ------------- * * Jass New Gen Pack 5d with latest AdicHelper and JassHelper * Here is download link: * http://www.mediafire.com/?aqfwy8wmrcuf67k * * API: * ---- * * Methods: * Clone() - returns copy of current copy of String. * Equals(String toCompare) - compare current copy of String with argumented copy of String. Returns boolean. * GetHashCode() - returns hash of current copy of String. * IndexOf(string value) - returns first index of argumented value. * IndexOf(string value, int start) - returns first index of argumented value since start position. * Insert(int start, string value) - returns string with inserted value on a start position. * LastIndexOf(string value) - returns last index of argumented value. * LastIndexOf(string value, int start) - returns last index of argumented value since start position. * Remove(int start) - removes all symbols after start position. Returns string. * Remove(int start, int count) - removes defined count of symbols after start position. Returns string. * Replace(string old, string new) - replacing all old values with new values. Returns string. * Substring(int start) - returns substring of current copy of String after start position. * Substring(int start, int length) - returns substring of current copy of String after start position with defined length. * Trim() - removes all spaces chars before and after text of current copy of String. Returns string. * create(string value) - create new copy of String with defined start value; * destroy() - destroy current copy of String. * * Operators: * [index] - returns indexed char of current copy of String. * [index]= - sets defined char of current copy of String. * Text - returns text of current copy of String. * Text = - sets new value of current copy of String. * * Cheers: * ---- * SirNikolas * **************************************/ library_once StringClass { #include "cj_types_priv.j"; struct String { private string VALUE; readonly int Length;
#define { IndexOf(value) = indexOf(value, 0); IndexOf(value, start) = indexOf(value, start); LastIndexOf(value) = lastIndexOf(value); LastIndexOf(value, start) = lastIndexOf_Overload(value, start); Remove(start) = remove(start); Remove(start, count) = remove_Overload(start, count); Substring(start) = substring(start); Substring(start, Length) = substring_Overload(start, Length); }
public string operator [] (int index) { return SubString(VALUE, index, index + 1); } public void operator []= (int index, string char) { if (StringLength(char) == 1) { VALUE = SubString(VALUE, 0, index) + char + SubString(VALUE, index + 1, Length); } }
public thistype Clone() { return thistype.create(VALUE); } public bool Equals (thistype toCompare) { return (Text == toCompare.Text); } public int GetHashCode() { return StringHash(VALUE); } public int indexOf(string value, int start) { int length = StringLength(value); whilenot (start >= Length) { if (SubString(VALUE, start, start + length) == value) { return start + length; } start++; } return -1; } public string Insert(int start, string value) { return SubString(VALUE, 0, start) + value + SubString(VALUE, start, Length); } public int lastIndexOf(string value) { int length = StringLength(value); for (int i = Length; i > 0; i--) { if (SubString(VALUE, i - length, i) == value) { return i; } } return -1; } public int lastIndexOf_Overload(string value, int start) { int Length = StringLength(value); for (int i = start; i > 0; i--) { if (SubString(VALUE, i - Length, i) == value) { return i; } } return -1; } public string remove(int start) { return SubString(VALUE, 0, start); } public string remove_Overload(int start, int count) { return SubString(VALUE, 0, start) + SubString(VALUE, start + count, Length); } public string Replace(string old, string new) { int oldLength = StringLength(old); int newLength = StringLength(new); int Length = Length; string out = VALUE; for (int i = 0; i < Length; i++) { if (SubString(out, i, i + oldLength) == old) { out = SubString(out, 0, i) + new + SubString(out, i + oldLength, Length); if (oldLength != newLength) { Length = StringLength(out); } } elseif ((Length - i) < oldLength) { break; } } return out; } public string operator Text() { return VALUE; } public void operator Text=(string value) { VALUE = value; Length = StringLength(value); } public string substring(int start) { return SubString(VALUE, start, Length); } public string substring_Overload(int start, int Length) { return SubString(VALUE, start, start + Length); } public string Trim() { string out = VALUE; int start = 0, end = Length; string temp; loop { temp = SubString(out, start, start + 1); exitwhen ((temp != " ") && (temp != "\r") && (temp != "\n")); start++; }
loop { temp = SubString(out, end - 1, end); exitwhen ((temp != " ") && (temp != "\r") && (temp != "\n")); end--; } if (start > end) { return ""; } return SubString(VALUE, start, end); }
public static thistype create(string value) { thistype out = thistype.allocate(); out.VALUE = value; out.Length = StringLength(value); return out; }
} }
Добавлено (11 Октября 2012, 22:57:39) --------------------------------------------- С англ. у меня плохо, не бейте сильно за плохой текст в примере. Все методы и операторы я описал комментариями в начале кода (оооочень кривым английским).
Сообщение отредактировал Ty3uK - Суббота, 13 Октября 2012, 12:09:22 |
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 11:32:44 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) public thistype Clone() { return this; } thistype out = allocate(); out.Text = Text; return out;Quote (Ty3uK) public bool Equals (thistype toCompare) { return (this == toCompare); } return Text == toCompare.Text; А ты сделал ReferenceEquals.Quote (Ty3uK) for (int i = start; i < LENGTH; i++) { if (SubString(VALUE, i, i + length) == value) { return i + length; } } whilenot start >= Length { if (SubString(VALUE, start, start + length) == value) { return start + length; } start++; }Quote (Ty3uK) public string Insert(int start, string value) { return SubString(VALUE, 0, start) + value + SubString(VALUE, start, StringLength(VALUE)); } return SubString(VALUE, 0, start) + value + SubString(VALUE, start, Length);Quote (Ty3uK) public string remove(int start) { return SubString(VALUE, 0, start - 1); } Почему -1?Quote (Ty3uK) Буду рад критике - алгоритмы не идеальны Code public string Trim() { int start = 0, end = Length; string c; loop { c = SubString(Text, start, start + 1); exitwhen c != " " && c != "\t" && c != "\r" && c != "\n"; start++; } loop { c = SubString(Text, end - 1, end); exitwhen c != " " && c != "\t" && c != "\r" && c != "\n"; end--; } if start >= end { return ""; } // ^ Возможно, эта проверка и не нужна return SubString(Text, start, end); }
Кстати, на XGM видел нечто подобное.
|
|
|
|
Ty3uK | Дата: Пятница, 12 Октября 2012, 12:11:56 | Сообщение # 3 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да, док делал похожее Спасибо, поправлю. Клон работает и без этого, бтв.
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 16:19:09 | Сообщение # 4 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) Клон работает и без этого, бтв. Старый клон:Code var s = new String("123"); var s2 = s.Clone(); s2.Text = "456"; BJDebugMsg(s.Text + s2.Text); //output: 456456 delete s; Новый клон:Code var s = new String("123"); var s2 = s.Clone(); s2.Text = "456"; BJDebugMsg(s.Text + s2.Text); //output: 123456 delete s, s2;
|
|
|
|
Ty3uK | Дата: Пятница, 12 Октября 2012, 16:32:29 | Сообщение # 5 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| понял, поправлю. но може но же и короче: Code return thistype.create(VALUE)
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 16:39:06 | Сообщение # 6 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Верно, что-то ступил.
|
|
|
|
Ty3uK | Дата: Суббота, 13 Октября 2012, 12:09:57 | Сообщение # 7 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| :3 Добавлено (13 Октября 2012, 12:09:57) --------------------------------------------- Обновил первый пост, большое спасибо за помощь, Ник!
|
|
|
|
SirNikolas | Дата: Суббота, 13 Октября 2012, 14:35:40 | Сообщение # 8 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Всегда пожалуйста.
|
|
|
|
Duosora | Дата: Понедельник, 05 Ноября 2012, 15:29:52 | Сообщение # 9 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Ty3uK, Велоспортом заняться решил? В варке сносный string, чтобы использовать его безо всяких short- и long- вариантов.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
SirNikolas | Дата: Понедельник, 05 Ноября 2012, 15:54:36 | Сообщение # 10 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Duosora, это же отличная тренировка для мозгов.
|
|
|
|
Duosora | Дата: Понедельник, 05 Ноября 2012, 16:00:08 | Сообщение # 11 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| SirNikolas, Согласен, но на практике она сделает процесс только медленнее. Если хочется хорошо помучать мозги - напиши новый язык программирования. Классно и на практике полезно.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Ty3uK | Дата: Понедельник, 05 Ноября 2012, 16:38:37 | Сообщение # 12 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Скажем так - диалект один написал
|
|
|
|
Скар | Дата: Вторник, 06 Ноября 2012, 10:17:42 | Сообщение # 13 |
5 уровень
Группа: Пользователи
Сообщений: 116
Награды: 0
Репутация: 12
Блокировки:
| типа Lolcode или Ook?
Если боишься - не делай, если делаешь - не бойся...
|
|
|
|
Ty3uK | Дата: Вторник, 06 Ноября 2012, 10:48:13 | Сообщение # 14 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| нет в поиск по форуму - JASP
|
|
|
|
Скар | Дата: Вторник, 06 Ноября 2012, 10:58:24 | Сообщение # 15 |
5 уровень
Группа: Пользователи
Сообщений: 116
Награды: 0
Репутация: 12
Блокировки:
| Да ладно, это была нотка утреннего троллинга
Если боишься - не делай, если делаешь - не бойся...
|
|
|
|
Ty3uK | Дата: Вторник, 06 Ноября 2012, 11:28:53 | Сообщение # 16 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| я знаю, про что ты говорил. Немного не то
|
|
|
|
|
|
|
|
|
|
|