33 const String::CharPointerType endOfLine,
35 const int numNewLineChars,
36 const int startInFile)
37 :
line (startOfLine, endOfLine),
47 int charNumInFile = 0;
53 auto startOfLineInFile = charNumInFile;
55 int numNewLineChars = 0;
59 auto c =
t.getAndAdvance();
93 numNewLineChars, startOfLineInFile));
109 for (
auto t =
line.getCharPointer();;)
111 auto c =
t.getAndAdvance();
118 if (
c !=
'\n' &&
c !=
'\r')
134 line (
p.getLineNumber()),
139 for (
int i = 0;
i <
p.getIndexInLine(); ++
i)
221 auto startPtr =
l->line.getCharPointer();
264 charPointer = prev->line.getCharPointer().findTerminatingNull();
281 return *(prev->line.getCharPointer().findTerminatingNull() - 1);
309 auto linePtr =
l->line.getCharPointer();
311 while (linePtr !=
charPointer && ! linePtr.isEmpty())
322 if (
auto* last =
document->lines.getLast())
324 auto lineIndex =
document->lines.size() - 1;
338 const int lineNum,
const int index)
noexcept
383bool CodeDocument::Position::operator== (
const Position& other)
const noexcept
389 &&
line == other.line
391 &&
owner == other.owner;
394bool CodeDocument::Position::operator!= (
const Position& other)
const noexcept
396 return ! operator== (other);
403 if (
owner->lines.size() == 0)
411 if (newLineNum >=
owner->lines.size())
425 if (
l.lineLengthWithoutNewLines > 0)
446 auto lineEnd =
owner->lines.size();
450 if (lineEnd - lineStart < 4)
452 for (
int i = lineStart;
i < lineEnd; ++
i)
454 auto&
l = *
owner->lines.getUnchecked (
i);
455 auto index = newPosition -
l.lineStartInFile;
457 if (index >= 0 && (index <
l.lineLength ||
i == lineEnd - 1))
469 auto midIndex = (lineStart + lineEnd + 1) / 2;
471 if (newPosition >=
owner->lines.getUnchecked (midIndex)->lineStartInFile)
472 lineStart = midIndex;
484 if (characterDelta == 1)
489 if (line < owner->
lines.size())
494 &&
indexInLine + characterDelta >=
l.lineLengthWithoutNewLines + 1)
505 p.moveBy (characterDelta);
538 if (
owner !=
nullptr)
543 owner->positionsToMaintain.add (
this);
549 owner->positionsToMaintain.removeFirstMatchingValue (
this);
572 if (
end.getPosition() <=
start.getPosition())
575 auto startLine =
start.getLineNumber();
576 auto endLine =
end.getLineNumber();
578 if (startLine == endLine)
580 if (
auto* line =
lines [startLine])
581 return line->line.substring (
start.getIndexInLine(),
end.getIndexInLine());
587 mo.preallocate ((
size_t) (
end.getPosition() -
start.getPosition() + 4));
589 auto maxLine =
jmin (
lines.size() - 1, endLine);
591 for (
int i =
jmax (0, startLine);
i <= maxLine; ++
i)
593 auto& line = *
lines.getUnchecked(
i);
594 auto len = line.lineLength;
598 auto index =
start.getIndexInLine();
599 mo << line.line.substring (index, len);
601 else if (
i == endLine)
603 len =
end.getIndexInLine();
604 mo << line.line.substring (0, len);
617 if (
auto* lastLine =
lines.getLast())
618 return lastLine->lineStartInFile + lastLine->lineLength;
625 if (
auto* line =
lines[lineIndex])
677 for (
auto&
c :
diff.changes)
680 remove (
c.start,
c.start +
c.length,
true);
682 insert (
c.insertedText,
c.start,
true);
689 insert (newContent, 0,
true);
706 const char* utf8 = temp.toUTF8();
708 if (! stream.
write (utf8, strlen (utf8)))
717 jassert (newChars ==
"\r\n" || newChars ==
"\n" || newChars ==
"\r");
762 const int maxDistance = 256;
765 while (
i < maxDistance
767 && (
i == 0 || (
p.getCharacter() !=
'\n'
768 &&
p.getCharacter() !=
'\r')))
784 while (
i < maxDistance
786 && (
i == 0 || (
p.getCharacter() !=
'\n'
787 &&
p.getCharacter() !=
'\r')))
800 const int maxDistance = 256;
802 bool stoppedAtLineStart =
false;
804 while (
i < maxDistance)
806 auto c =
p.movedBy (-1).getCharacter();
808 if (
c ==
'\r' ||
c ==
'\n')
810 stoppedAtLineStart =
true;
823 if (
i < maxDistance && ! stoppedAtLineStart)
842 while (isTokenCharacter (
end.getCharacter()))
846 while (
start.getIndexInLine() > 0
847 && isTokenCharacter (
start.movedBy (-1).getCharacter()))
853 s.setLineAndIndex (pos.getLineNumber(), 0);
854 e.setLineAndIndex (pos.getLineNumber() + 1, 0);
859 while (
lines.size() > 0
860 &&
lines.getLast()->lineLength == 0
861 && (
lines.size() == 1 || !
lines.getUnchecked (
lines.size() - 2)->endsWithLineBreak()))
891 owner.currentActionIndex++;
898 owner.currentActionIndex--;
914 if (
text.isNotEmpty())
925 auto* firstLine =
lines[firstAffectedLine];
926 auto textInsideOriginalLine =
text;
928 if (firstLine !=
nullptr)
931 textInsideOriginalLine = firstLine->line.substring (0, index)
932 + textInsideOriginalLine
933 + firstLine->line.substring (index);
942 newFirstLine->lineStartInFile = firstLine !=
nullptr ? firstLine->lineStartInFile : 0;
943 lines.set (firstAffectedLine, newFirstLine);
945 if (newLines.
size() > 1)
948 int lineStart = newFirstLine->lineStartInFile;
950 for (
int i = firstAffectedLine;
i <
lines.size(); ++
i)
952 auto&
l = *
lines.getUnchecked (
i);
953 l.lineStartInFile = lineStart;
954 lineStart +=
l.lineLength;
958 auto newTextLength =
text.length();
961 if (
p->getPosition() >= insertPos)
962 p->setPosition (
p->getPosition() + newTextLength);
981 owner.currentActionIndex++;
988 owner.currentActionIndex--;
1004 if (endPos <= startPos)
1013 Position startPosition (*
this, startPos);
1014 Position endPosition (*
this, endPos);
1019 auto& firstLine = *
lines.getUnchecked (firstAffectedLine);
1021 if (firstAffectedLine == endLine)
1023 firstLine.line = firstLine.line.substring (0, startPosition.
getIndexInLine())
1025 firstLine.updateLength();
1029 auto& lastLine = *
lines.getUnchecked (endLine);
1031 firstLine.line = firstLine.line.substring (0, startPosition.
getIndexInLine())
1033 firstLine.updateLength();
1035 int numLinesToRemove = endLine - firstAffectedLine;
1036 lines.removeRange (firstAffectedLine + 1, numLinesToRemove);
1039 for (
int i = firstAffectedLine + 1;
i <
lines.size(); ++
i)
1041 auto&
l = *
lines.getUnchecked (
i);
1042 auto& previousLine = *
lines.getUnchecked (
i - 1);
1043 l.lineStartInFile = previousLine.lineStartInFile + previousLine.lineLength;
1052 p->setPosition (
jmax (startPos,
p->getPosition() + startPos - endPos));
1054 if (
p->getPosition() > totalChars)
1055 p->setPosition (totalChars);
1066struct CodeDocumentTest :
public UnitTest
1072 void runTest()
override
1074 const juce::String jabberwocky (
"'Twas brillig, and the slithy toves\n"
1075 "Did gyre and gimble in the wabe;\n"
1076 "All mimsy were the borogoves,\n"
1077 "And the mome raths outgrabe.\n\n"
1079 "'Beware the Jabberwock, my son!\n"
1080 "The jaws that bite, the claws that catch!\n"
1081 "Beware the Jubjub bird, and shun\n"
1082 "The frumious Bandersnatch!'");
1085 beginTest (
"Basic checks");
1087 d.replaceAllContent (jabberwocky);
1089 expectEquals (
d.getNumLines(), 9);
1090 expect (
d.getLine (0).startsWith (
"'Twas brillig"));
1091 expect (
d.getLine (2).startsWith (
"All mimsy"));
1092 expectEquals (
d.getLine (4),
String (
"\n"));
1096 beginTest (
"Insert/replace/delete");
1099 d.replaceAllContent (jabberwocky);
1101 d.insertText (CodeDocument::Position (
d, 0, 6),
"very ");
1102 expect (
d.getLine (0).startsWith (
"'Twas very brillig"),
1103 "Insert text within a line");
1105 d.replaceSection (74, 83,
"Quite hungry");
1106 expectEquals (
d.getLine (2), String (
"Quite hungry were the borogoves,\n"),
1107 "Replace section at start of line");
1109 d.replaceSection (11, 18,
"cold");
1110 expectEquals (
d.getLine (0), String (
"'Twas very cold, and the slithy toves\n"),
1111 "Replace section within a line");
1113 d.deleteSection (CodeDocument::Position (
d, 2, 0), CodeDocument::Position (
d, 2, 6));
1114 expectEquals (
d.getLine (2), String (
"hungry were the borogoves,\n"),
1115 "Delete section within a line");
1117 d.deleteSection (CodeDocument::Position (
d, 2, 6), CodeDocument::Position (
d, 5, 11));
1118 expectEquals (
d.getLine (2), String (
"hungry Jabberwock, my son!\n"),
1119 "Delete section across multiple line");
1123 beginTest (
"Line splitting and joining");
1126 d.replaceAllContent (jabberwocky);
1127 expectEquals (
d.getNumLines(), 9);
1129 const String splitComment (
"Adding a newline should split a line into two.");
1130 d.insertText (49,
"\n");
1132 expectEquals (
d.getNumLines(), 10, splitComment);
1133 expectEquals (
d.getLine (1), String (
"Did gyre and \n"), splitComment);
1134 expectEquals (
d.getLine (2), String (
"gimble in the wabe;\n"), splitComment);
1136 const String joinComment (
"Removing a newline should join two lines.");
1137 d.deleteSection (CodeDocument::Position (
d, 0, 35),
1138 CodeDocument::Position (
d, 1, 0));
1140 expectEquals (
d.getNumLines(), 9, joinComment);
1141 expectEquals (
d.getLine (0), String (
"'Twas brillig, and the slithy tovesDid gyre and \n"), joinComment);
1142 expectEquals (
d.getLine (1), String (
"gimble in the wabe;\n"), joinComment);
1146 beginTest (
"Undo/redo");
1149 d.replaceAllContent (jabberwocky);
1151 d.insertText (30,
"INSERT1");
1153 d.insertText (70,
"INSERT2");
1156 expect (
d.getAllContent().contains (
"INSERT1"),
"1st edit should remain.");
1157 expect (!
d.getAllContent().contains (
"INSERT2"),
"2nd edit should be undone.");
1160 expect (
d.getAllContent().contains (
"INSERT2"),
"2nd edit should be redone.");
1163 d.deleteSection (25, 90);
1164 expect (!
d.getAllContent().contains (
"INSERT1"),
"1st edit should be deleted.");
1165 expect (!
d.getAllContent().contains (
"INSERT2"),
"2nd edit should be deleted.");
1167 expect (
d.getAllContent().contains (
"INSERT1"),
"1st edit should be restored.");
1168 expect (
d.getAllContent().contains (
"INSERT2"),
"1st edit should be restored.");
1172 expectEquals (
d.getAllContent(), jabberwocky,
"Original document should be restored.");
1176 beginTest (
"Positions");
1179 d.replaceAllContent (jabberwocky);
1182 const String comment (
"Keeps negative positions inside document.");
1183 CodeDocument::Position p1 (
d, 0, -3);
1184 CodeDocument::Position p2 (
d, -8);
1185 expectEquals (p1.getLineNumber(), 0, comment);
1186 expectEquals (p1.getIndexInLine(), 0, comment);
1187 expectEquals (p1.getCharacter(),
juce_wchar (
'\''), comment);
1188 expectEquals (p2.getLineNumber(), 0, comment);
1189 expectEquals (p2.getIndexInLine(), 0, comment);
1190 expectEquals (p2.getCharacter(),
juce_wchar (
'\''), comment);
1194 const String comment (
"Moving by character handles newlines correctly.");
1195 CodeDocument::Position p1 (
d, 0, 35);
1197 expectEquals (p1.getLineNumber(), 1, comment);
1198 expectEquals (p1.getIndexInLine(), 0, comment);
1200 expectEquals (p1.getLineNumber(), 3, comment);
1204 const String comment1 (
"setPositionMaintained tracks position.");
1205 const String comment2 (
"setPositionMaintained tracks position following undos.");
1207 CodeDocument::Position p1 (
d, 3, 0);
1208 p1.setPositionMaintained (
true);
1209 expectEquals (p1.getCharacter(),
juce_wchar (
'A'), comment1);
1212 d.insertText (p1,
"INSERT1");
1214 expectEquals (p1.getCharacter(),
juce_wchar (
'A'), comment1);
1215 expectEquals (p1.getLineNumber(), 3, comment1);
1216 expectEquals (p1.getIndexInLine(), 7, comment1);
1218 expectEquals (p1.getIndexInLine(), 0, comment2);
1221 d.insertText (15,
"\n");
1223 expectEquals (p1.getLineNumber(), 4, comment1);
1225 expectEquals (p1.getLineNumber(), 3, comment2);
1230 beginTest (
"Iterators");
1233 d.replaceAllContent (jabberwocky);
1236 const String comment1 (
"Basic iteration.");
1237 const String comment2 (
"Reverse iteration.");
1238 const String comment3 (
"Reverse iteration stops at doc start.");
1239 const String comment4 (
"Check iteration across line boundaries.");
1241 CodeDocument::Iterator it (
d);
1242 expectEquals (it.peekNextChar(),
juce_wchar (
'\''), comment1);
1243 expectEquals (it.nextChar(),
juce_wchar (
'\''), comment1);
1244 expectEquals (it.nextChar(),
juce_wchar (
'T'), comment1);
1245 expectEquals (it.nextChar(),
juce_wchar (
'w'), comment1);
1246 expectEquals (it.peekNextChar(),
juce_wchar (
'a'), comment2);
1247 expectEquals (it.previousChar(),
juce_wchar (
'w'), comment2);
1248 expectEquals (it.previousChar(),
juce_wchar (
'T'), comment2);
1249 expectEquals (it.previousChar(),
juce_wchar (
'\''), comment2);
1250 expectEquals (it.previousChar(),
juce_wchar (0), comment3);
1251 expect (it.isSOF(), comment3);
1253 while (it.peekNextChar() !=
juce_wchar (
'D'))
1256 expectEquals (it.nextChar(),
juce_wchar (
'D'), comment3);
1257 expectEquals (it.peekNextChar(),
juce_wchar (
'i'), comment3);
1258 expectEquals (it.previousChar(),
juce_wchar (
'D'), comment3);
1259 expectEquals (it.previousChar(),
juce_wchar (
'\n'), comment3);
1260 expectEquals (it.previousChar(),
juce_wchar (
's'), comment3);
1264 const String comment1 (
"Iterator created from CodeDocument::Position objects.");
1265 const String comment2 (
"CodeDocument::Position created from Iterator objects.");
1266 const String comment3 (
"CodeDocument::Position created from EOF Iterator objects.");
1268 CodeDocument::Position
p (
d, 6, 0);
1269 CodeDocument::Iterator it (
p);
1271 expectEquals (it.nextChar(),
juce_wchar (
'T'), comment1);
1272 expectEquals (it.nextChar(),
juce_wchar (
'h'), comment1);
1273 expectEquals (it.previousChar(),
juce_wchar (
'h'), comment1);
1274 expectEquals (it.previousChar(),
juce_wchar (
'T'), comment1);
1275 expectEquals (it.previousChar(),
juce_wchar (
'\n'), comment1);
1276 expectEquals (it.previousChar(),
juce_wchar (
'!'), comment1);
1278 const auto p2 = it.toPosition();
1279 expectEquals (p2.getLineNumber(), 5, comment2);
1280 expectEquals (p2.getIndexInLine(), 30, comment2);
1282 while (! it.isEOF())
1285 const auto p3 = it.toPosition();
1286 expectEquals (p3.getLineNumber(),
d.getNumLines() - 1, comment3);
1287 expectEquals (p3.getIndexInLine(),
d.getLine (
d.getNumLines() - 1).length(), comment3);
1293static CodeDocumentTest codeDocumentTests;
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition juce_Array.h:56
ElementType getUnchecked(int index) const
Definition juce_Array.h:252
int size() const noexcept
Definition juce_Array.h:215
ElementType * getRawDataPointer() noexcept
Definition juce_Array.h:310
void add(const ElementType &newElement)
Definition juce_Array.h:418
static bool isWhitespace(char character) noexcept
Definition juce_CharacterFunctions.cpp:59
static bool isLetterOrDigit(char character) noexcept
Definition juce_CharacterFunctions.cpp:90
bool reinitialiseCharPtr() const
Definition juce_CodeDocument.cpp:159
int position
Definition juce_CodeDocument.h:425
void skip() noexcept
Definition juce_CodeDocument.cpp:199
String::CharPointerType charPointer
Definition juce_CodeDocument.h:424
juce_wchar peekNextChar() const noexcept
Definition juce_CodeDocument.cpp:227
bool isEOF() const noexcept
Definition juce_CodeDocument.cpp:293
CodeDocument::Position toPosition() const
Definition juce_CodeDocument.cpp:303
Iterator() noexcept
Definition juce_CodeDocument.cpp:151
int line
Definition juce_CodeDocument.h:425
bool isSOF() const noexcept
Definition juce_CodeDocument.cpp:298
juce_wchar nextChar() noexcept
Definition juce_CodeDocument.cpp:175
void skipToEndOfLine() noexcept
Definition juce_CodeDocument.cpp:204
void skipToStartOfLine() noexcept
Definition juce_CodeDocument.cpp:214
juce_wchar peekPreviousChar() const noexcept
Definition juce_CodeDocument.cpp:270
const CodeDocument * document
Definition juce_CodeDocument.h:423
juce_wchar previousChar() noexcept
Definition juce_CodeDocument.cpp:241
~Iterator() noexcept
Definition juce_CodeDocument.cpp:156
void skipWhitespace() noexcept
Definition juce_CodeDocument.cpp:287
Definition juce_CodeDocument.h:328
Definition juce_CodeDocument.h:63
juce_wchar getCharacter() const
Definition juce_CodeDocument.cpp:516
int getIndexInLine() const noexcept
Definition juce_CodeDocument.h:144
int getPosition() const noexcept
Definition juce_CodeDocument.h:120
int getLineNumber() const noexcept
Definition juce_CodeDocument.h:136
int line
Definition juce_CodeDocument.h:184
friend class CodeDocument
Definition juce_CodeDocument.h:187
CodeDocument * owner
Definition juce_CodeDocument.h:183
int indexInLine
Definition juce_CodeDocument.h:184
void setLineAndIndex(int newLineNumber, int newIndexInLine)
Definition juce_CodeDocument.cpp:399
bool positionMaintained
Definition juce_CodeDocument.h:185
void moveBy(int characterDelta)
Definition juce_CodeDocument.cpp:480
void setPositionMaintained(bool isMaintained)
Definition juce_CodeDocument.cpp:532
Position movedByLines(int deltaLines) const
Definition juce_CodeDocument.cpp:509
~Position()
Definition juce_CodeDocument.cpp:358
int characterPos
Definition juce_CodeDocument.h:184
Position movedBy(int characterDelta) const
Definition juce_CodeDocument.cpp:502
Position() noexcept
Definition juce_CodeDocument.cpp:333
void setPosition(int charactersFromStartOfDocument)
Definition juce_CodeDocument.cpp:435
String getLineText() const
Definition juce_CodeDocument.cpp:524
void undo()
Definition juce_CodeDocument.cpp:726
Position findWordBreakBefore(const Position &position) const noexcept
Definition juce_CodeDocument.cpp:797
int indexOfSavedState
Definition juce_CodeDocument.h:438
void addListener(Listener *listener)
Definition juce_CodeDocument.cpp:878
void insert(const String &text, int insertPos, bool undoable)
Definition juce_CodeDocument.cpp:912
UndoManager undoManager
Definition juce_CodeDocument.h:437
String getAllContent() const
Definition juce_CodeDocument.cpp:564
int getNumCharacters() const noexcept
Definition juce_CodeDocument.cpp:615
void replaceAllContent(const String &newContent)
Definition juce_CodeDocument.cpp:686
void remove(int startPos, int endPos, bool undoable)
Definition juce_CodeDocument.cpp:1002
int maximumLineLength
Definition juce_CodeDocument.h:439
String getLine(int lineIndex) const noexcept
Definition juce_CodeDocument.cpp:623
void clearUndoHistory()
Definition juce_CodeDocument.cpp:737
void newTransaction()
Definition juce_CodeDocument.cpp:721
void checkLastLineStatus()
Definition juce_CodeDocument.cpp:857
void setNewLineCharacters(const String &newLineCharacters) noexcept
Definition juce_CodeDocument.cpp:715
Array< Position * > positionsToMaintain
Definition juce_CodeDocument.h:436
void replaceSection(int startIndex, int endIndex, const String &newText)
Definition juce_CodeDocument.cpp:664
void applyChanges(const String &newContent)
Definition juce_CodeDocument.cpp:670
String newLineChars
Definition juce_CodeDocument.h:441
Position findWordBreakAfter(const Position &position) const noexcept
Definition juce_CodeDocument.cpp:759
void findLineContaining(const Position &pos, Position &start, Position &end) const noexcept
Definition juce_CodeDocument.cpp:851
void removeListener(Listener *listener)
Definition juce_CodeDocument.cpp:879
void insertText(const Position &position, const String &text)
Definition juce_CodeDocument.cpp:654
CodeDocument()
Definition juce_CodeDocument.cpp:556
OwnedArray< CodeDocumentLine > lines
Definition juce_CodeDocument.h:435
void deleteSection(const Position &startPosition, const Position &endPosition)
Definition juce_CodeDocument.cpp:644
int currentActionIndex
Definition juce_CodeDocument.h:438
~CodeDocument()
Definition juce_CodeDocument.cpp:560
int getMaximumLineLength() noexcept
Definition juce_CodeDocument.cpp:631
bool loadFromStream(InputStream &stream)
Definition juce_CodeDocument.cpp:692
bool writeToStream(OutputStream &stream)
Definition juce_CodeDocument.cpp:701
void redo()
Definition juce_CodeDocument.cpp:732
bool hasChangedSinceSavePoint() const noexcept
Definition juce_CodeDocument.cpp:747
void findTokenContaining(const Position &pos, Position &start, Position &end) const noexcept
Definition juce_CodeDocument.cpp:837
void setSavePoint() noexcept
Definition juce_CodeDocument.cpp:742
ListenerList< Listener > listeners
Definition juce_CodeDocument.h:440
String getTextBetween(const Position &start, const Position &end) const
Definition juce_CodeDocument.cpp:570
Definition juce_CodeDocument.cpp:30
CodeDocumentLine(const String::CharPointerType startOfLine, const String::CharPointerType endOfLine, const int lineLen, const int numNewLineChars, const int startInFile)
Definition juce_CodeDocument.cpp:32
int lineLengthWithoutNewLines
Definition juce_CodeDocument.cpp:124
static void createLines(Array< CodeDocumentLine * > &newLines, StringRef text)
Definition juce_CodeDocument.cpp:44
String line
Definition juce_CodeDocument.cpp:123
void updateLength() noexcept
Definition juce_CodeDocument.cpp:104
int lineStartInFile
Definition juce_CodeDocument.cpp:124
bool endsWithLineBreak() const noexcept
Definition juce_CodeDocument.cpp:99
int lineLength
Definition juce_CodeDocument.cpp:124
Definition juce_MemoryOutputStream.h:36
Definition juce_OutputStream.h:38
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
static StringArray fromLines(StringRef stringToBreakUp)
Definition juce_StringArray.cpp:403
Definition juce_String.h:53
Definition juce_StringRef.h:62
Definition juce_TextDiff.h:37
Definition juce_UnitTest.h:70
* e
Definition inflate.c:1404
int * l
Definition inflate.c:1579
struct huft * t
Definition inflate.c:943
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
virtual ASIOError start()=0
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
static int getCharacterType(juce_wchar character) noexcept
Definition juce_CodeDocument.cpp:753
Definition juce_Uuid.h:141
#define max(x, y)
Definition os.h:78
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
Definition juce_CodeDocument.cpp:971
DeleteAction(CodeDocument &doc, int start, int end) noexcept
Definition juce_CodeDocument.cpp:972
const int startPos
Definition juce_CodeDocument.cpp:996
bool perform() override
Definition juce_CodeDocument.cpp:979
const String removedText
Definition juce_CodeDocument.cpp:997
const int endPos
Definition juce_CodeDocument.cpp:996
bool undo() override
Definition juce_CodeDocument.cpp:986
CodeDocument & owner
Definition juce_CodeDocument.cpp:995
int getSizeInUnits() override
Definition juce_CodeDocument.cpp:993
Definition juce_CodeDocument.cpp:883
CodeDocument & owner
Definition juce_CodeDocument.cpp:905
bool undo() override
Definition juce_CodeDocument.cpp:896
const String text
Definition juce_CodeDocument.cpp:906
int getSizeInUnits() override
Definition juce_CodeDocument.cpp:903
bool perform() override
Definition juce_CodeDocument.cpp:889
const int insertPos
Definition juce_CodeDocument.cpp:907
InsertAction(CodeDocument &doc, const String &t, const int pos) noexcept
Definition juce_CodeDocument.cpp:884
const char * text
Definition swell-functions.h:167
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
mo
Definition zipinfo.c:2287
#define const
Definition zconf.h:137