2001-09-28 20:14:13 +00:00
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2001-10-25 01:08:40 +00:00
// vim:cindent:ts=2:et:sw=2:
2012-05-21 11:12:37 +00:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/. */
2006-03-29 18:29:03 +00:00
/* representation of one line within a block frame, a CSS line box */
1998-12-01 16:13:49 +00:00
# ifndef nsLineBox_h___
# define nsLineBox_h___
2011-11-21 06:21:16 +00:00
# include "mozilla/Attributes.h"
2012-10-26 13:32:10 +00:00
# include "mozilla/Likely.h"
2011-11-21 06:21:16 +00:00
1999-05-13 00:54:28 +00:00
# include "nsILineIterator.h"
2009-08-31 18:25:35 +00:00
# include "nsIFrame.h"
2013-01-15 12:22:03 +00:00
# include <algorithm>
1998-12-01 16:13:49 +00:00
class nsLineBox ;
2003-10-13 21:51:02 +00:00
class nsFloatCache ;
class nsFloatCacheList ;
class nsFloatCacheFreeList ;
1999-09-15 00:28:10 +00:00
2003-10-13 21:51:02 +00:00
// State cached after reflowing a float. This state is used during
// incremental reflow when we avoid reflowing a float.
class nsFloatCache {
1999-09-15 00:28:10 +00:00
public :
2003-10-13 21:51:02 +00:00
nsFloatCache ( ) ;
2000-12-16 18:56:06 +00:00
# ifdef NS_BUILD_REFCNT_LOGGING
2003-10-13 21:51:02 +00:00
~ nsFloatCache ( ) ;
1999-10-08 20:41:19 +00:00
# else
2003-10-13 21:51:02 +00:00
~ nsFloatCache ( ) { }
1999-10-08 20:41:19 +00:00
# endif
1999-09-15 00:28:10 +00:00
2003-10-13 21:51:02 +00:00
nsFloatCache * Next ( ) const { return mNext ; }
1999-09-15 00:28:10 +00:00
2009-08-31 18:25:35 +00:00
nsIFrame * mFloat ; // floating frame
1999-09-15 00:28:10 +00:00
protected :
2003-10-13 21:51:02 +00:00
nsFloatCache * mNext ;
1999-09-15 00:28:10 +00:00
2003-10-13 21:51:02 +00:00
friend class nsFloatCacheList ;
friend class nsFloatCacheFreeList ;
1999-09-15 00:28:10 +00:00
} ;
//----------------------------------------
2003-10-13 21:51:02 +00:00
class nsFloatCacheList {
1999-09-15 00:28:10 +00:00
public :
2005-10-21 22:23:28 +00:00
# ifdef NS_BUILD_REFCNT_LOGGING
nsFloatCacheList ( ) ;
# else
2012-07-30 14:20:58 +00:00
nsFloatCacheList ( ) : mHead ( nullptr ) { }
2005-10-21 22:23:28 +00:00
# endif
2003-10-13 21:51:02 +00:00
~ nsFloatCacheList ( ) ;
1999-09-15 00:28:10 +00:00
2011-09-29 06:19:26 +00:00
bool IsEmpty ( ) const {
2012-07-30 14:20:58 +00:00
return nullptr = = mHead ;
1999-09-15 00:28:10 +00:00
}
2011-09-29 06:19:26 +00:00
bool NotEmpty ( ) const {
2012-07-30 14:20:58 +00:00
return nullptr ! = mHead ;
1999-09-15 00:28:10 +00:00
}
2003-10-13 21:51:02 +00:00
nsFloatCache * Head ( ) const {
1999-09-15 00:28:10 +00:00
return mHead ;
}
2003-10-13 21:51:02 +00:00
nsFloatCache * Tail ( ) const ;
1999-09-15 00:28:10 +00:00
2006-06-29 01:19:48 +00:00
void DeleteAll ( ) ;
2003-10-13 21:51:02 +00:00
nsFloatCache * Find ( nsIFrame * aOutOfFlowFrame ) ;
1999-09-15 00:28:10 +00:00
2005-10-21 22:23:28 +00:00
// Remove a nsFloatCache from this list. Deleting this nsFloatCache
// becomes the caller's responsibility.
2006-06-29 01:19:48 +00:00
void Remove ( nsFloatCache * aElement ) { RemoveAndReturnPrev ( aElement ) ; }
2006-04-17 01:47:11 +00:00
// Steal away aList's nsFloatCache objects and put them in this
// list. aList must not be empty.
2003-10-13 21:51:02 +00:00
void Append ( nsFloatCacheFreeList & aList ) ;
1999-09-15 00:28:10 +00:00
protected :
2003-10-13 21:51:02 +00:00
nsFloatCache * mHead ;
1999-09-15 00:28:10 +00:00
2006-06-29 01:19:48 +00:00
// Remove a nsFloatCache from this list. Deleting this nsFloatCache
// becomes the caller's responsibility. Returns the nsFloatCache that was
2012-07-30 14:20:58 +00:00
// before aElement, or nullptr if aElement was the first.
2006-06-29 01:19:48 +00:00
nsFloatCache * RemoveAndReturnPrev ( nsFloatCache * aElement ) ;
2003-10-13 21:51:02 +00:00
friend class nsFloatCacheFreeList ;
1999-09-15 00:28:10 +00:00
} ;
//---------------------------------------
2006-06-29 01:19:48 +00:00
// Like nsFloatCacheList, but with fast access to the tail
1999-09-15 00:28:10 +00:00
2006-06-29 01:19:48 +00:00
class nsFloatCacheFreeList : private nsFloatCacheList {
1999-09-15 00:28:10 +00:00
public :
2005-10-21 22:23:28 +00:00
# ifdef NS_BUILD_REFCNT_LOGGING
nsFloatCacheFreeList ( ) ;
~ nsFloatCacheFreeList ( ) ;
# else
2012-07-30 14:20:58 +00:00
nsFloatCacheFreeList ( ) : mTail ( nullptr ) { }
2003-10-13 21:51:02 +00:00
~ nsFloatCacheFreeList ( ) { }
2005-10-21 22:23:28 +00:00
# endif
1999-09-15 00:28:10 +00:00
2006-06-29 01:19:48 +00:00
// Reimplement trivial functions
2011-09-29 06:19:26 +00:00
bool IsEmpty ( ) const {
2012-07-30 14:20:58 +00:00
return nullptr = = mHead ;
2006-06-29 01:19:48 +00:00
}
nsFloatCache * Head ( ) const {
return mHead ;
}
nsFloatCache * Tail ( ) const {
return mTail ;
}
2011-09-29 06:19:26 +00:00
bool NotEmpty ( ) const {
2012-07-30 14:20:58 +00:00
return nullptr ! = mHead ;
2006-06-29 01:19:48 +00:00
}
void DeleteAll ( ) ;
2003-10-13 21:51:02 +00:00
// Steal away aList's nsFloatCache objects and put them on this
2006-04-17 01:47:11 +00:00
// free-list. aList must not be empty.
2003-10-13 21:51:02 +00:00
void Append ( nsFloatCacheList & aList ) ;
1999-09-15 00:28:10 +00:00
2003-10-13 21:51:02 +00:00
void Append ( nsFloatCache * aFloatCache ) ;
1999-09-15 00:28:10 +00:00
2006-06-29 01:19:48 +00:00
void Remove ( nsFloatCache * aElement ) ;
2006-06-26 22:18:23 +00:00
2006-06-29 01:19:48 +00:00
// Remove an nsFloatCache object from this list and return it, or create
2009-08-31 18:25:36 +00:00
// a new one if this one is empty; Set its mFloat to aFloat.
nsFloatCache * Alloc ( nsIFrame * aFloat ) ;
2006-06-29 01:19:48 +00:00
1999-09-15 00:28:10 +00:00
protected :
2003-10-13 21:51:02 +00:00
nsFloatCache * mTail ;
1999-09-15 00:28:10 +00:00
2003-10-13 21:51:02 +00:00
friend class nsFloatCacheList ;
1999-09-15 00:28:10 +00:00
} ;
//----------------------------------------------------------------------
1999-10-14 23:10:03 +00:00
# define LINE_MAX_BREAK_TYPE ((1 << 4) - 1)
2012-09-28 06:57:33 +00:00
# define LINE_MAX_CHILD_COUNT INT32_MAX
1999-10-14 23:10:03 +00:00
2012-03-11 02:32:27 +00:00
/**
* Function to create a line box and initialize it with a single frame .
2013-03-23 20:10:33 +00:00
* The allocation is infallible .
2012-03-11 02:32:27 +00:00
* If the frame was moved from another line then you ' re responsible
* for notifying that line using NoteFrameRemoved ( ) . Alternatively ,
* it ' s better to use the next function that does that for you in an
* optimal way .
*/
2000-03-12 03:00:51 +00:00
nsLineBox * NS_NewLineBox ( nsIPresShell * aPresShell , nsIFrame * aFrame ,
2012-03-11 02:32:27 +00:00
bool aIsBlock ) ;
/**
* Function to create a line box and initialize it with aCount frames
2013-03-23 20:10:33 +00:00
* that are currently on aFromLine . The allocation is infallible .
2012-03-11 02:32:27 +00:00
*/
nsLineBox * NS_NewLineBox ( nsIPresShell * aPresShell , nsLineBox * aFromLine ,
2012-08-22 15:56:38 +00:00
nsIFrame * aFrame , int32_t aCount ) ;
2000-03-12 03:00:51 +00:00
2001-10-25 01:08:40 +00:00
class nsLineList ;
// don't use the following names outside of this file. Instead, use
// nsLineList::iterator, etc. These are just here to allow them to
// be specified as parameters to methods of nsLineBox.
class nsLineList_iterator ;
class nsLineList_const_iterator ;
class nsLineList_reverse_iterator ;
class nsLineList_const_reverse_iterator ;
/**
* Users must have the class that is to be part of the list inherit
* from nsLineLink . If they want to be efficient , it should be the
* first base class . ( This was originally nsCLink in a templatized
* nsCList , but it ' s still useful separately . )
*/
class nsLineLink {
public :
friend class nsLineList ;
friend class nsLineList_iterator ;
friend class nsLineList_reverse_iterator ;
friend class nsLineList_const_iterator ;
friend class nsLineList_const_reverse_iterator ;
private :
nsLineLink * _mNext ; // or head
nsLineLink * _mPrev ; // or tail
} ;
1998-12-01 16:13:49 +00:00
/**
* The nsLineBox class represents a horizontal line of frames . It contains
* enough state to support incremental reflow of the frames , event handling
* for the frames , and rendering of the frames .
*/
2015-03-21 16:28:04 +00:00
class nsLineBox final : public nsLineLink {
2000-03-12 03:00:51 +00:00
private :
2012-08-22 15:56:38 +00:00
nsLineBox ( nsIFrame * aFrame , int32_t aCount , bool aIsBlock ) ;
1999-10-12 23:24:22 +00:00
~ nsLineBox ( ) ;
2000-03-12 03:00:51 +00:00
// Overloaded new operator. Uses an arena (which comes from the presShell)
// to perform the allocation.
2002-07-03 17:14:41 +00:00
void * operator new ( size_t sz , nsIPresShell * aPresShell ) CPP_THROW_NEW ;
2015-01-06 23:35:02 +00:00
void operator delete ( void * aPtr , size_t sz ) = delete ;
2000-03-12 03:00:51 +00:00
public :
2012-03-11 02:32:27 +00:00
// Use these functions to allocate and destroy line boxes
2000-03-12 03:00:51 +00:00
friend nsLineBox * NS_NewLineBox ( nsIPresShell * aPresShell , nsIFrame * aFrame ,
2012-03-11 02:32:27 +00:00
bool aIsBlock ) ;
friend nsLineBox * NS_NewLineBox ( nsIPresShell * aPresShell , nsLineBox * aFromLine ,
2012-08-22 15:56:38 +00:00
nsIFrame * aFrame , int32_t aCount ) ;
2000-03-12 03:00:51 +00:00
void Destroy ( nsIPresShell * aPresShell ) ;
1999-10-19 23:04:19 +00:00
1999-10-14 23:10:03 +00:00
// mBlock bit
2011-09-29 06:19:26 +00:00
bool IsBlock ( ) const {
1999-10-12 23:24:22 +00:00
return mFlags . mBlock ;
}
2011-09-29 06:19:26 +00:00
bool IsInline ( ) const {
1999-10-12 23:24:22 +00:00
return 0 = = mFlags . mBlock ;
}
1999-10-14 23:10:03 +00:00
// mDirty bit
void MarkDirty ( ) {
mFlags . mDirty = 1 ;
}
void ClearDirty ( ) {
mFlags . mDirty = 0 ;
}
2011-09-29 06:19:26 +00:00
bool IsDirty ( ) const {
1999-10-14 23:10:03 +00:00
return mFlags . mDirty ;
}
2001-10-25 01:08:40 +00:00
// mPreviousMarginDirty bit
void MarkPreviousMarginDirty ( ) {
mFlags . mPreviousMarginDirty = 1 ;
}
void ClearPreviousMarginDirty ( ) {
mFlags . mPreviousMarginDirty = 0 ;
}
2011-09-29 06:19:26 +00:00
bool IsPreviousMarginDirty ( ) const {
2001-10-25 01:08:40 +00:00
return mFlags . mPreviousMarginDirty ;
}
2004-11-25 14:51:00 +00:00
// mHasClearance bit
void SetHasClearance ( ) {
mFlags . mHasClearance = 1 ;
}
void ClearHasClearance ( ) {
mFlags . mHasClearance = 0 ;
}
2011-09-29 06:19:26 +00:00
bool HasClearance ( ) const {
2004-11-25 14:51:00 +00:00
return mFlags . mHasClearance ;
}
2003-10-13 21:51:02 +00:00
// mImpactedByFloat bit
2011-09-29 06:19:26 +00:00
void SetLineIsImpactedByFloat ( bool aValue ) {
2003-10-13 21:51:02 +00:00
mFlags . mImpactedByFloat = aValue ;
1999-10-14 23:10:03 +00:00
}
2011-09-29 06:19:26 +00:00
bool IsImpactedByFloat ( ) const {
2003-10-13 21:51:02 +00:00
return mFlags . mImpactedByFloat ;
1999-10-14 23:10:03 +00:00
}
2000-01-03 04:32:13 +00:00
// mLineWrapped bit
2011-09-29 06:19:26 +00:00
void SetLineWrapped ( bool aOn ) {
2000-01-03 04:32:13 +00:00
mFlags . mLineWrapped = aOn ;
}
2011-09-29 06:19:26 +00:00
bool IsLineWrapped ( ) const {
2000-01-03 04:32:13 +00:00
return mFlags . mLineWrapped ;
}
2000-08-24 04:26:43 +00:00
2007-09-18 03:00:16 +00:00
// mInvalidateTextRuns bit
2011-09-29 06:19:26 +00:00
void SetInvalidateTextRuns ( bool aOn ) {
2007-09-18 03:00:16 +00:00
mFlags . mInvalidateTextRuns = aOn ;
}
2011-09-29 06:19:26 +00:00
bool GetInvalidateTextRuns ( ) const {
2007-09-18 03:00:16 +00:00
return mFlags . mInvalidateTextRuns ;
}
2000-09-11 20:46:44 +00:00
// mResizeReflowOptimizationDisabled bit
void DisableResizeReflowOptimization ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mResizeReflowOptimizationDisabled = true ;
2000-09-11 20:46:44 +00:00
}
void EnableResizeReflowOptimization ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mResizeReflowOptimizationDisabled = false ;
2000-09-11 20:46:44 +00:00
}
2011-09-29 06:19:26 +00:00
bool ResizeReflowOptimizationDisabled ( ) const {
2000-09-11 20:46:44 +00:00
return mFlags . mResizeReflowOptimizationDisabled ;
}
2009-08-11 02:48:42 +00:00
// mHasBullet bit
void SetHasBullet ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mHasBullet = true ;
2009-08-11 02:48:42 +00:00
InvalidateCachedIsEmpty ( ) ;
}
void ClearHasBullet ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mHasBullet = false ;
2009-08-11 02:48:42 +00:00
InvalidateCachedIsEmpty ( ) ;
}
2011-09-29 06:19:26 +00:00
bool HasBullet ( ) const {
2009-08-11 02:48:42 +00:00
return mFlags . mHasBullet ;
}
2010-08-06 04:59:20 +00:00
// mHadFloatPushed bit
void SetHadFloatPushed ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mHadFloatPushed = true ;
2010-08-06 04:59:20 +00:00
}
void ClearHadFloatPushed ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mHadFloatPushed = false ;
2010-08-06 04:59:20 +00:00
}
2011-09-29 06:19:26 +00:00
bool HadFloatPushed ( ) const {
2010-08-06 04:59:20 +00:00
return mFlags . mHadFloatPushed ;
}
2012-03-11 02:32:27 +00:00
private :
// Add a hash table for fast lookup when the line has more frames than this.
2012-08-22 15:56:38 +00:00
static const uint32_t kMinChildCountForHashtable = 200 ;
2012-03-11 02:32:27 +00:00
/**
* Take ownership of aFromLine ' s hash table and remove the frames that
* stay on aFromLine from it , i . e . aFromLineNewCount frames starting with
* mFirstChild . This method is used to optimize moving a large number
* of frames from one line to the next .
*/
2012-08-22 15:56:38 +00:00
void StealHashTableFrom ( nsLineBox * aFromLine , uint32_t aFromLineNewCount ) ;
2010-08-06 04:59:20 +00:00
2012-03-11 02:32:27 +00:00
/**
* Does the equivalent of this - > NoteFrameAdded and aFromLine - > NoteFrameRemoved
* for each frame on this line , but in a optimized way .
*/
void NoteFramesMovedFrom ( nsLineBox * aFromLine ) ;
void SwitchToHashtable ( )
{
MOZ_ASSERT ( ! mFlags . mHasHashedFrames ) ;
2012-08-22 15:56:38 +00:00
uint32_t count = GetChildCount ( ) ;
2012-03-11 02:32:27 +00:00
mFlags . mHasHashedFrames = 1 ;
2014-08-06 13:31:21 +00:00
uint32_t minLength = std : : max ( kMinChildCountForHashtable ,
uint32_t ( PL_DHASH_DEFAULT_INITIAL_LENGTH ) ) ;
mFrames = new nsTHashtable < nsPtrHashKey < nsIFrame > > ( std : : max ( count , minLength ) ) ;
2012-03-11 02:32:27 +00:00
for ( nsIFrame * f = mFirstChild ; count - - > 0 ; f = f - > GetNextSibling ( ) ) {
mFrames - > PutEntry ( f ) ;
}
}
void SwitchToCounter ( ) {
MOZ_ASSERT ( mFlags . mHasHashedFrames ) ;
2012-08-22 15:56:38 +00:00
uint32_t count = GetChildCount ( ) ;
2012-03-11 02:32:27 +00:00
delete mFrames ;
mFlags . mHasHashedFrames = 0 ;
mChildCount = count ;
}
public :
2012-08-22 15:56:38 +00:00
int32_t GetChildCount ( ) const {
2012-10-26 13:32:10 +00:00
return MOZ_UNLIKELY ( mFlags . mHasHashedFrames ) ? mFrames - > Count ( ) : mChildCount ;
1999-10-14 23:10:03 +00:00
}
2012-03-11 02:32:27 +00:00
/**
* Register that aFrame is now on this line .
*/
void NoteFrameAdded ( nsIFrame * aFrame ) {
2012-10-26 13:32:10 +00:00
if ( MOZ_UNLIKELY ( mFlags . mHasHashedFrames ) ) {
2012-03-11 02:32:27 +00:00
mFrames - > PutEntry ( aFrame ) ;
} else {
if ( + + mChildCount > = kMinChildCountForHashtable ) {
SwitchToHashtable ( ) ;
}
1999-10-14 23:10:03 +00:00
}
2012-03-11 02:32:27 +00:00
}
/**
* Register that aFrame is not on this line anymore .
*/
void NoteFrameRemoved ( nsIFrame * aFrame ) {
MOZ_ASSERT ( GetChildCount ( ) > 0 ) ;
2012-10-26 13:32:10 +00:00
if ( MOZ_UNLIKELY ( mFlags . mHasHashedFrames ) ) {
2012-03-11 02:32:27 +00:00
mFrames - > RemoveEntry ( aFrame ) ;
if ( mFrames - > Count ( ) < kMinChildCountForHashtable ) {
SwitchToCounter ( ) ;
}
} else {
- - mChildCount ;
1999-10-14 23:10:03 +00:00
}
}
// mBreakType value
2004-11-25 14:51:00 +00:00
// Break information is applied *before* the line if the line is a block,
// or *after* the line if the line is an inline. Confusing, I know, but
// using different names should help.
2011-09-29 06:19:26 +00:00
bool HasBreakBefore ( ) const {
2004-11-25 14:51:00 +00:00
return IsBlock ( ) & & NS_STYLE_CLEAR_NONE ! = mFlags . mBreakType ;
}
2012-08-22 15:56:38 +00:00
void SetBreakTypeBefore ( uint8_t aBreakType ) {
2004-11-25 14:51:00 +00:00
NS_ASSERTION ( IsBlock ( ) , " Only blocks have break-before " ) ;
2014-03-02 17:42:16 +00:00
NS_ASSERTION ( aBreakType = = NS_STYLE_CLEAR_NONE | |
aBreakType = = NS_STYLE_CLEAR_LEFT | |
aBreakType = = NS_STYLE_CLEAR_RIGHT | |
aBreakType = = NS_STYLE_CLEAR_BOTH ,
2004-11-25 14:51:00 +00:00
" Only float break types are allowed before a line " ) ;
mFlags . mBreakType = aBreakType ;
}
2012-08-22 15:56:38 +00:00
uint8_t GetBreakTypeBefore ( ) const {
2004-11-25 14:51:00 +00:00
return IsBlock ( ) ? mFlags . mBreakType : NS_STYLE_CLEAR_NONE ;
1999-10-12 23:24:22 +00:00
}
2004-11-25 14:51:00 +00:00
2011-09-29 06:19:26 +00:00
bool HasBreakAfter ( ) const {
2004-11-25 14:51:00 +00:00
return ! IsBlock ( ) & & NS_STYLE_CLEAR_NONE ! = mFlags . mBreakType ;
2004-09-13 02:21:35 +00:00
}
2012-08-22 15:56:38 +00:00
void SetBreakTypeAfter ( uint8_t aBreakType ) {
2004-11-25 14:51:00 +00:00
NS_ASSERTION ( ! IsBlock ( ) , " Only inlines have break-after " ) ;
NS_ASSERTION ( aBreakType < = LINE_MAX_BREAK_TYPE , " bad break type " ) ;
1999-10-12 23:24:22 +00:00
mFlags . mBreakType = aBreakType ;
}
2011-09-29 06:19:26 +00:00
bool HasFloatBreakAfter ( ) const {
2004-11-25 14:51:00 +00:00
return ! IsBlock ( ) & & ( NS_STYLE_CLEAR_LEFT = = mFlags . mBreakType | |
NS_STYLE_CLEAR_RIGHT = = mFlags . mBreakType | |
2014-03-02 17:42:16 +00:00
NS_STYLE_CLEAR_BOTH = = mFlags . mBreakType ) ;
2004-11-25 14:51:00 +00:00
}
2012-08-22 15:56:38 +00:00
uint8_t GetBreakTypeAfter ( ) const {
2004-11-25 14:51:00 +00:00
return ! IsBlock ( ) ? mFlags . mBreakType : NS_STYLE_CLEAR_NONE ;
1999-10-12 23:24:22 +00:00
}
1998-12-01 16:13:49 +00:00
2014-06-20 09:55:35 +00:00
// mCarriedOutBEndMargin value
nsCollapsingMargin GetCarriedOutBEndMargin ( ) const ;
2011-10-17 14:59:28 +00:00
// Returns true if the margin changed
2014-06-20 09:55:35 +00:00
bool SetCarriedOutBEndMargin ( nsCollapsingMargin aValue ) ;
1999-10-14 23:10:03 +00:00
2003-10-13 21:51:02 +00:00
// mFloats
2011-09-29 06:19:26 +00:00
bool HasFloats ( ) const {
2003-10-13 21:51:02 +00:00
return ( IsInline ( ) & & mInlineData ) & & mInlineData - > mFloats . NotEmpty ( ) ;
1998-12-01 16:13:49 +00:00
}
2003-10-13 21:51:02 +00:00
nsFloatCache * GetFirstFloat ( ) ;
void FreeFloats ( nsFloatCacheFreeList & aFreeList ) ;
void AppendFloats ( nsFloatCacheFreeList & aFreeList ) ;
2011-09-29 06:19:26 +00:00
bool RemoveFloat ( nsIFrame * aFrame ) ;
1998-12-01 16:13:49 +00:00
2002-11-21 15:20:20 +00:00
// Combined area is the area of the line that should influence the
// overflow area of its parent block. The combined area should be
// used for painting-related things, but should never be used for
// layout (except for handling of 'overflow').
2010-10-07 04:25:45 +00:00
void SetOverflowAreas ( const nsOverflowAreas & aOverflowAreas ) ;
2014-10-21 22:16:13 +00:00
mozilla : : LogicalRect GetOverflowArea ( nsOverflowType aType ,
mozilla : : WritingMode aWM ,
nscoord aContainerWidth )
{
return mozilla : : LogicalRect ( aWM , GetOverflowArea ( aType ) , aContainerWidth ) ;
}
2010-10-07 04:25:45 +00:00
nsRect GetOverflowArea ( nsOverflowType aType ) {
2014-04-16 08:03:28 +00:00
return mData ? mData - > mOverflowAreas . Overflow ( aType ) : GetPhysicalBounds ( ) ;
2004-01-22 15:06:25 +00:00
}
2010-10-07 04:25:45 +00:00
nsOverflowAreas GetOverflowAreas ( ) {
if ( mData ) {
return mData - > mOverflowAreas ;
}
2014-04-16 08:03:28 +00:00
nsRect bounds = GetPhysicalBounds ( ) ;
return nsOverflowAreas ( bounds , bounds ) ;
2010-10-07 04:25:45 +00:00
}
nsRect GetVisualOverflowArea ( )
{ return GetOverflowArea ( eVisualOverflow ) ; }
nsRect GetScrollableOverflowArea ( )
{ return GetOverflowArea ( eScrollableOverflow ) ; }
1998-12-01 16:13:49 +00:00
2014-04-16 08:03:28 +00:00
void SlideBy ( nscoord aDBCoord , nscoord aContainerWidth ) {
NS_ASSERTION ( aContainerWidth = = mContainerWidth | | mContainerWidth = = - 1 ,
" container width doesn't match " ) ;
mContainerWidth = aContainerWidth ;
mBounds . BStart ( mWritingMode ) + = aDBCoord ;
1999-10-14 23:10:03 +00:00
if ( mData ) {
2014-11-13 08:58:03 +00:00
nsPoint physicalDelta = mozilla : : LogicalPoint ( mWritingMode , 0 , aDBCoord ) .
GetPhysicalPoint ( mWritingMode , 0 ) ;
2010-10-07 04:25:45 +00:00
NS_FOR_FRAME_OVERFLOW_TYPES ( otype ) {
2014-11-13 08:58:03 +00:00
mData - > mOverflowAreas . Overflow ( otype ) + = physicalDelta ;
2010-10-07 04:25:45 +00:00
}
1999-10-14 23:10:03 +00:00
}
}
2014-12-16 09:45:41 +00:00
// Container-width for the line is changing (and therefore if writing mode
// was vertical-rl, the line will move physically; this is like SlideBy,
// but it is the container width instead of the line's own logical coord
// that is changing.
nscoord UpdateContainerWidth ( nscoord aNewContainerWidth )
{
NS_ASSERTION ( mContainerWidth ! = - 1 , " container width not set " ) ;
nscoord delta = mContainerWidth - aNewContainerWidth ;
mContainerWidth = aNewContainerWidth ;
// this has a physical-coordinate effect only in vertical-rl mode
if ( mWritingMode . IsVerticalRL ( ) & & mData ) {
nsPoint physicalDelta = mozilla : : LogicalPoint ( mWritingMode , 0 , delta ) .
GetPhysicalPoint ( mWritingMode , 0 ) ;
NS_FOR_FRAME_OVERFLOW_TYPES ( otype ) {
mData - > mOverflowAreas . Overflow ( otype ) + = physicalDelta ;
}
}
return delta ;
}
2014-04-16 08:03:28 +00:00
void IndentBy ( nscoord aDICoord , nscoord aContainerWidth ) {
NS_ASSERTION ( aContainerWidth = = mContainerWidth | | mContainerWidth = = - 1 ,
" container width doesn't match " ) ;
mContainerWidth = aContainerWidth ;
mBounds . IStart ( mWritingMode ) + = aDICoord ;
}
void ExpandBy ( nscoord aDISize , nscoord aContainerWidth ) {
NS_ASSERTION ( aContainerWidth = = mContainerWidth | | mContainerWidth = = - 1 ,
" container width doesn't match " ) ;
mContainerWidth = aContainerWidth ;
mBounds . ISize ( mWritingMode ) + = aDISize ;
}
2002-12-11 04:00:18 +00:00
/**
2014-06-17 12:19:38 +00:00
* The logical ascent ( distance from block - start to baseline ) of the
* linebox is the logical ascent of the anonymous inline box ( for
* which we don ' t actually create a frame ) that wraps all the
* consecutive inline children of a block .
2002-12-11 04:00:18 +00:00
*
* This is currently unused for block lines .
*/
2014-06-17 12:19:38 +00:00
nscoord GetLogicalAscent ( ) const { return mAscent ; }
void SetLogicalAscent ( nscoord aAscent ) { mAscent = aAscent ; }
1999-10-14 23:10:03 +00:00
2014-04-16 08:03:28 +00:00
nscoord BStart ( ) const {
return mBounds . BStart ( mWritingMode ) ;
}
nscoord BSize ( ) const {
return mBounds . BSize ( mWritingMode ) ;
}
nscoord BEnd ( ) const {
return mBounds . BEnd ( mWritingMode ) ;
}
nscoord IStart ( ) const {
return mBounds . IStart ( mWritingMode ) ;
}
nscoord ISize ( ) const {
return mBounds . ISize ( mWritingMode ) ;
}
nscoord IEnd ( ) const {
return mBounds . IEnd ( mWritingMode ) ;
}
void SetBoundsEmpty ( ) {
mBounds . IStart ( mWritingMode ) = 0 ;
mBounds . ISize ( mWritingMode ) = 0 ;
mBounds . BStart ( mWritingMode ) = 0 ;
mBounds . BSize ( mWritingMode ) = 0 ;
1999-10-14 23:10:03 +00:00
}
1998-12-01 16:13:49 +00:00
2009-12-24 05:21:15 +00:00
static void DeleteLineList ( nsPresContext * aPresContext , nsLineList & aLines ,
2012-10-15 01:34:23 +00:00
nsIFrame * aDestructRoot , nsFrameList * aFrames ) ;
1998-12-01 16:13:49 +00:00
2001-10-25 01:08:40 +00:00
// search from end to beginning of [aBegin, aEnd)
2011-10-17 14:59:28 +00:00
// Returns true if it found the line and false if not.
2001-10-25 01:08:40 +00:00
// Moves aEnd as it searches so that aEnd points to the resulting line.
2009-10-02 16:31:43 +00:00
// aLastFrameBeforeEnd is the last frame before aEnd (so if aEnd is
// the end of the line list, it's just the last frame in the frame
// list).
2011-09-29 06:19:26 +00:00
static bool RFindLineContaining ( nsIFrame * aFrame ,
2001-10-25 01:08:40 +00:00
const nsLineList_iterator & aBegin ,
nsLineList_iterator & aEnd ,
2009-10-02 16:31:43 +00:00
nsIFrame * aLastFrameBeforeEnd ,
2012-08-22 15:56:38 +00:00
int32_t * aFrameIndexInLine ) ;
2001-10-25 01:08:40 +00:00
2014-01-05 23:31:14 +00:00
# ifdef DEBUG_FRAME_DUMP
2012-08-22 15:56:38 +00:00
char * StateToString ( char * aBuf , int32_t aBufSize ) const ;
2001-10-25 01:08:40 +00:00
2012-09-19 14:36:35 +00:00
void List ( FILE * out , int32_t aIndent , uint32_t aFlags = 0 ) const ;
2014-01-26 22:07:02 +00:00
void List ( FILE * out = stderr , const char * aPrefix = " " , uint32_t aFlags = 0 ) const ;
1998-12-01 16:13:49 +00:00
nsIFrame * LastChild ( ) const ;
2012-03-08 01:57:37 +00:00
# endif
1998-12-01 16:13:49 +00:00
2012-03-11 02:32:27 +00:00
private :
2012-08-22 15:56:38 +00:00
int32_t IndexOf ( nsIFrame * aFrame ) const ;
2012-03-11 02:32:27 +00:00
public :
1999-04-20 21:52:22 +00:00
2011-09-29 06:19:26 +00:00
bool Contains ( nsIFrame * aFrame ) const {
2012-10-26 13:32:10 +00:00
return MOZ_UNLIKELY ( mFlags . mHasHashedFrames ) ? mFrames - > Contains ( aFrame )
2012-03-11 02:32:27 +00:00
: IndexOf ( aFrame ) > = 0 ;
1999-04-20 21:52:22 +00:00
}
1998-12-01 16:13:49 +00:00
2001-10-25 01:08:40 +00:00
// whether the line box is "logically" empty (just like nsIFrame::IsEmpty)
2011-09-29 06:19:26 +00:00
bool IsEmpty ( ) const ;
2001-10-25 01:08:40 +00:00
2004-11-24 13:22:10 +00:00
// Call this only while in Reflow() for the block the line belongs
// to, only between reflowing the line (or sliding it, if we skip
2005-11-20 22:05:24 +00:00
// reflowing it) and the end of reflowing the block.
2011-11-07 05:25:56 +00:00
bool CachedIsEmpty ( ) ;
2004-11-24 13:22:10 +00:00
void InvalidateCachedIsEmpty ( ) {
2011-10-17 14:59:28 +00:00
mFlags . mEmptyCacheValid = false ;
2004-11-24 13:22:10 +00:00
}
// For debugging purposes
2011-11-07 05:25:56 +00:00
bool IsValidCachedIsEmpty ( ) {
2004-11-24 13:22:10 +00:00
return mFlags . mEmptyCacheValid ;
}
1999-10-02 02:51:03 +00:00
# ifdef DEBUG
2012-08-22 15:56:38 +00:00
static int32_t GetCtorCount ( ) ;
1999-10-02 02:51:03 +00:00
# endif
1998-12-01 16:13:49 +00:00
nsIFrame * mFirstChild ;
1999-10-14 23:10:03 +00:00
2014-04-16 08:03:28 +00:00
mozilla : : WritingMode mWritingMode ;
2014-11-13 08:58:03 +00:00
// Physical width. Use only for physical <-> logical coordinate conversion.
2014-04-16 08:03:28 +00:00
nscoord mContainerWidth ;
2014-11-13 08:58:03 +00:00
2014-04-16 08:03:28 +00:00
private :
mozilla : : LogicalRect mBounds ;
2014-11-13 08:58:03 +00:00
2014-04-16 08:03:28 +00:00
public :
const mozilla : : LogicalRect & GetBounds ( ) { return mBounds ; }
nsRect GetPhysicalBounds ( ) const
{
2014-10-05 06:02:36 +00:00
if ( mBounds . IsAllZero ( ) ) {
2014-04-16 08:03:28 +00:00
return nsRect ( 0 , 0 , 0 , 0 ) ;
}
NS_ASSERTION ( mContainerWidth ! = - 1 , " mContainerWidth not initialized " ) ;
return mBounds . GetPhysicalRect ( mWritingMode , mContainerWidth ) ;
}
void SetBounds ( mozilla : : WritingMode aWritingMode ,
nscoord aIStart , nscoord aBStart ,
nscoord aISize , nscoord aBSize ,
nscoord aContainerWidth )
{
mWritingMode = aWritingMode ;
mContainerWidth = aContainerWidth ;
mBounds = mozilla : : LogicalRect ( aWritingMode , aIStart , aBStart ,
aISize , aBSize ) ;
}
void SetBounds ( mozilla : : WritingMode aWritingMode ,
nsRect aRect , nscoord aContainerWidth )
{
mWritingMode = aWritingMode ;
mContainerWidth = aContainerWidth ;
mBounds = mozilla : : LogicalRect ( aWritingMode , aRect , aContainerWidth ) ;
}
1999-10-12 23:24:22 +00:00
2012-03-11 02:32:27 +00:00
// mFlags.mHasHashedFrames says which one to use
union {
nsTHashtable < nsPtrHashKey < nsIFrame > > * mFrames ;
2012-08-22 15:56:38 +00:00
uint32_t mChildCount ;
2012-03-11 02:32:27 +00:00
} ;
1999-10-12 23:24:22 +00:00
struct FlagBits {
2012-08-22 15:56:38 +00:00
uint32_t mDirty : 1 ;
uint32_t mPreviousMarginDirty : 1 ;
uint32_t mHasClearance : 1 ;
uint32_t mBlock : 1 ;
uint32_t mImpactedByFloat : 1 ;
uint32_t mLineWrapped : 1 ;
uint32_t mInvalidateTextRuns : 1 ;
uint32_t mResizeReflowOptimizationDisabled : 1 ; // default 0 = means that the opt potentially applies to this line. 1 = never skip reflowing this line for a resize reflow
uint32_t mEmptyCacheValid : 1 ;
uint32_t mEmptyCacheState : 1 ;
2009-08-11 02:48:42 +00:00
// mHasBullet indicates that this is an inline line whose block's
2009-09-11 10:46:36 +00:00
// bullet is adjacent to this line and non-empty.
2012-08-22 15:56:38 +00:00
uint32_t mHasBullet : 1 ;
2010-08-06 04:59:20 +00:00
// Indicates that this line *may* have a placeholder for a float
// that was pushed to a later column or page.
2012-08-22 15:56:38 +00:00
uint32_t mHadFloatPushed : 1 ;
uint32_t mHasHashedFrames : 1 ;
uint32_t mBreakType : 4 ;
1999-10-14 23:10:03 +00:00
} ;
struct ExtraData {
2014-09-01 03:36:37 +00:00
explicit ExtraData ( const nsRect & aBounds ) : mOverflowAreas ( aBounds , aBounds ) {
1999-10-14 23:10:03 +00:00
}
2010-10-07 04:25:45 +00:00
nsOverflowAreas mOverflowAreas ;
1999-10-14 23:10:03 +00:00
} ;
struct ExtraBlockData : public ExtraData {
2014-09-01 03:36:37 +00:00
explicit ExtraBlockData ( const nsRect & aBounds )
2001-10-25 01:08:40 +00:00
: ExtraData ( aBounds ) ,
2014-06-20 09:55:35 +00:00
mCarriedOutBEndMargin ( )
2001-10-25 01:08:40 +00:00
{
1999-10-14 23:10:03 +00:00
}
2014-06-20 09:55:35 +00:00
nsCollapsingMargin mCarriedOutBEndMargin ;
1999-10-14 23:10:03 +00:00
} ;
1999-10-12 23:24:22 +00:00
1999-10-14 23:10:03 +00:00
struct ExtraInlineData : public ExtraData {
2014-09-01 03:36:37 +00:00
explicit ExtraInlineData ( const nsRect & aBounds ) : ExtraData ( aBounds ) {
1999-10-14 23:10:03 +00:00
}
2003-10-13 21:51:02 +00:00
nsFloatCacheList mFloats ;
1999-10-12 23:24:22 +00:00
} ;
protected :
2002-12-11 04:00:18 +00:00
nscoord mAscent ; // see |SetAscent| / |GetAscent|
1999-10-12 23:24:22 +00:00
union {
2012-08-22 15:56:38 +00:00
uint32_t mAllFlags ;
1999-10-12 23:24:22 +00:00
FlagBits mFlags ;
} ;
1999-10-14 23:10:03 +00:00
union {
ExtraData * mData ;
ExtraBlockData * mBlockData ;
ExtraInlineData * mInlineData ;
} ;
1999-10-19 23:04:19 +00:00
void Cleanup ( ) ;
1999-10-14 23:10:03 +00:00
void MaybeFreeData ( ) ;
1998-12-01 16:13:49 +00:00
} ;
2001-10-25 01:08:40 +00:00
/**
* A linked list type where the items in the list must inherit from
* a link type to fuse allocations .
*
* API heavily based on the | list | class in the C + + standard .
*/
class nsLineList_iterator {
public :
friend class nsLineList ;
friend class nsLineList_reverse_iterator ;
friend class nsLineList_const_iterator ;
friend class nsLineList_const_reverse_iterator ;
typedef nsLineList_iterator iterator_self_type ;
typedef nsLineList_reverse_iterator iterator_reverse_type ;
typedef nsLineBox & reference ;
typedef const nsLineBox & const_reference ;
typedef nsLineBox * pointer ;
typedef const nsLineBox * const_pointer ;
2012-08-22 15:56:38 +00:00
typedef uint32_t size_type ;
typedef int32_t difference_type ;
2001-10-25 01:08:40 +00:00
typedef nsLineLink link_type ;
2012-06-25 19:59:42 +00:00
# ifdef DEBUG
2007-02-08 13:53:51 +00:00
nsLineList_iterator ( ) { memset ( & mCurrent , 0xcd , sizeof ( mCurrent ) ) ; }
# else
2001-10-25 01:08:40 +00:00
// Auto generated default constructor OK.
2007-02-08 13:53:51 +00:00
# endif
2001-10-25 01:08:40 +00:00
// Auto generated copy-constructor OK.
inline iterator_self_type &
operator = ( const iterator_self_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_reverse_type & aOther ) ;
iterator_self_type & operator + + ( )
{
mCurrent = mCurrent - > _mNext ;
return * this ;
}
iterator_self_type operator + + ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mNext ;
return rv ;
}
iterator_self_type & operator - - ( )
{
mCurrent = mCurrent - > _mPrev ;
return * this ;
}
iterator_self_type operator - - ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mPrev ;
return rv ;
}
reference operator * ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
pointer operator - > ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
pointer get ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
operator pointer ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_reference operator * ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer operator - > ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# ifndef __MWERKS__
operator const_pointer ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# endif /* !__MWERKS__ */
iterator_self_type next ( )
{
iterator_self_type copy ( * this ) ;
return + + copy ;
}
const iterator_self_type next ( ) const
{
iterator_self_type copy ( * this ) ;
return + + copy ;
}
iterator_self_type prev ( )
{
iterator_self_type copy ( * this ) ;
return - - copy ;
}
const iterator_self_type prev ( ) const
{
iterator_self_type copy ( * this ) ;
return - - copy ;
}
2001-10-25 06:34:10 +00:00
// Passing by value rather than by reference and reference to const
// to keep AIX happy.
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther ) const
2007-07-11 00:55:15 +00:00
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
2007-07-11 00:55:15 +00:00
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther ) const
2007-07-11 00:55:15 +00:00
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
2007-07-11 00:55:15 +00:00
return mCurrent ! = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther )
2007-07-11 00:55:15 +00:00
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
2007-07-11 00:55:15 +00:00
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther )
2007-07-11 00:55:15 +00:00
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
2007-07-11 00:55:15 +00:00
return mCurrent ! = aOther . mCurrent ;
}
2001-10-25 01:08:40 +00:00
private :
link_type * mCurrent ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
link_type * mListLink ; // the list's link, i.e., the end
# endif
} ;
class nsLineList_reverse_iterator {
public :
friend class nsLineList ;
friend class nsLineList_iterator ;
friend class nsLineList_const_iterator ;
friend class nsLineList_const_reverse_iterator ;
typedef nsLineList_reverse_iterator iterator_self_type ;
typedef nsLineList_iterator iterator_reverse_type ;
typedef nsLineBox & reference ;
typedef const nsLineBox & const_reference ;
typedef nsLineBox * pointer ;
typedef const nsLineBox * const_pointer ;
2012-08-22 15:56:38 +00:00
typedef uint32_t size_type ;
typedef int32_t difference_type ;
2001-10-25 01:08:40 +00:00
typedef nsLineLink link_type ;
2012-06-25 19:59:42 +00:00
# ifdef DEBUG
2007-02-08 13:53:51 +00:00
nsLineList_reverse_iterator ( ) { memset ( & mCurrent , 0xcd , sizeof ( mCurrent ) ) ; }
# else
2001-10-25 01:08:40 +00:00
// Auto generated default constructor OK.
2007-02-08 13:53:51 +00:00
# endif
2001-10-25 01:08:40 +00:00
// Auto generated copy-constructor OK.
inline iterator_self_type &
operator = ( const iterator_reverse_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_self_type & aOther ) ;
iterator_self_type & operator + + ( )
{
mCurrent = mCurrent - > _mPrev ;
return * this ;
}
iterator_self_type operator + + ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mPrev ;
return rv ;
}
iterator_self_type & operator - - ( )
{
mCurrent = mCurrent - > _mNext ;
return * this ;
}
iterator_self_type operator - - ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mNext ;
return rv ;
}
reference operator * ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
pointer operator - > ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
pointer get ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
operator pointer ( )
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_reference operator * ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer operator - > ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# ifndef __MWERKS__
operator const_pointer ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# endif /* !__MWERKS__ */
2001-10-25 06:34:10 +00:00
// Passing by value rather than by reference and reference to const
// to keep AIX happy.
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2001-10-25 01:08:40 +00:00
private :
link_type * mCurrent ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
link_type * mListLink ; // the list's link, i.e., the end
# endif
} ;
class nsLineList_const_iterator {
public :
friend class nsLineList ;
friend class nsLineList_iterator ;
friend class nsLineList_reverse_iterator ;
friend class nsLineList_const_reverse_iterator ;
typedef nsLineList_const_iterator iterator_self_type ;
typedef nsLineList_const_reverse_iterator iterator_reverse_type ;
typedef nsLineList_iterator iterator_nonconst_type ;
typedef nsLineList_reverse_iterator iterator_nonconst_reverse_type ;
typedef nsLineBox & reference ;
typedef const nsLineBox & const_reference ;
typedef nsLineBox * pointer ;
typedef const nsLineBox * const_pointer ;
2012-08-22 15:56:38 +00:00
typedef uint32_t size_type ;
typedef int32_t difference_type ;
2001-10-25 01:08:40 +00:00
typedef nsLineLink link_type ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2007-02-08 13:53:51 +00:00
nsLineList_const_iterator ( ) { memset ( & mCurrent , 0xcd , sizeof ( mCurrent ) ) ; }
# else
2001-10-25 01:08:40 +00:00
// Auto generated default constructor OK.
2007-02-08 13:53:51 +00:00
# endif
2001-10-25 01:08:40 +00:00
// Auto generated copy-constructor OK.
inline iterator_self_type &
operator = ( const iterator_nonconst_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_nonconst_reverse_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_self_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_reverse_type & aOther ) ;
iterator_self_type & operator + + ( )
{
mCurrent = mCurrent - > _mNext ;
return * this ;
}
iterator_self_type operator + + ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mNext ;
return rv ;
}
iterator_self_type & operator - - ( )
{
mCurrent = mCurrent - > _mPrev ;
return * this ;
}
iterator_self_type operator - - ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mPrev ;
return rv ;
}
const_reference operator * ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer operator - > ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer get ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# ifndef __MWERKS__
operator const_pointer ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# endif /* !__MWERKS__ */
const iterator_self_type next ( ) const
{
iterator_self_type copy ( * this ) ;
return + + copy ;
}
const iterator_self_type prev ( ) const
{
iterator_self_type copy ( * this ) ;
return - - copy ;
}
2001-10-25 06:34:10 +00:00
// Passing by value rather than by reference and reference to const
// to keep AIX happy.
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2001-10-25 01:08:40 +00:00
private :
const link_type * mCurrent ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
const link_type * mListLink ; // the list's link, i.e., the end
# endif
} ;
class nsLineList_const_reverse_iterator {
public :
friend class nsLineList ;
friend class nsLineList_iterator ;
friend class nsLineList_reverse_iterator ;
friend class nsLineList_const_iterator ;
typedef nsLineList_const_reverse_iterator iterator_self_type ;
typedef nsLineList_const_iterator iterator_reverse_type ;
typedef nsLineList_iterator iterator_nonconst_reverse_type ;
typedef nsLineList_reverse_iterator iterator_nonconst_type ;
typedef nsLineBox & reference ;
typedef const nsLineBox & const_reference ;
typedef nsLineBox * pointer ;
typedef const nsLineBox * const_pointer ;
2012-08-22 15:56:38 +00:00
typedef uint32_t size_type ;
typedef int32_t difference_type ;
2001-10-25 01:08:40 +00:00
typedef nsLineLink link_type ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2007-02-08 13:53:51 +00:00
nsLineList_const_reverse_iterator ( ) { memset ( & mCurrent , 0xcd , sizeof ( mCurrent ) ) ; }
# else
2001-10-25 01:08:40 +00:00
// Auto generated default constructor OK.
2007-02-08 13:53:51 +00:00
# endif
2001-10-25 01:08:40 +00:00
// Auto generated copy-constructor OK.
inline iterator_self_type &
operator = ( const iterator_nonconst_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_nonconst_reverse_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_self_type & aOther ) ;
inline iterator_self_type &
operator = ( const iterator_reverse_type & aOther ) ;
iterator_self_type & operator + + ( )
{
mCurrent = mCurrent - > _mPrev ;
return * this ;
}
iterator_self_type operator + + ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mPrev ;
return rv ;
}
iterator_self_type & operator - - ( )
{
mCurrent = mCurrent - > _mNext ;
return * this ;
}
iterator_self_type operator - - ( int )
{
iterator_self_type rv ( * this ) ;
mCurrent = mCurrent - > _mNext ;
return rv ;
}
const_reference operator * ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return * static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer operator - > ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer get ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# ifndef __MWERKS__
operator const_pointer ( ) const
{
2015-02-09 22:34:50 +00:00
MOZ_ASSERT ( mCurrent ! = mListLink , " running past end " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mCurrent ) ;
2001-10-25 01:08:40 +00:00
}
# endif /* !__MWERKS__ */
2001-10-25 06:34:10 +00:00
// Passing by value rather than by reference and reference to const
// to keep AIX happy.
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther ) const
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator = = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent = = aOther . mCurrent ;
}
2011-09-29 06:19:26 +00:00
bool operator ! = ( const iterator_self_type aOther )
2007-08-02 22:43:14 +00:00
{
NS_ASSERTION ( mListLink = = aOther . mListLink , " comparing iterators over different lists " ) ;
return mCurrent ! = aOther . mCurrent ;
}
2001-10-25 01:08:40 +00:00
//private:
const link_type * mCurrent ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
const link_type * mListLink ; // the list's link, i.e., the end
# endif
} ;
class nsLineList {
public :
friend class nsLineList_iterator ;
friend class nsLineList_reverse_iterator ;
friend class nsLineList_const_iterator ;
friend class nsLineList_const_reverse_iterator ;
2012-08-22 15:56:38 +00:00
typedef uint32_t size_type ;
typedef int32_t difference_type ;
2001-10-25 01:08:40 +00:00
typedef nsLineLink link_type ;
private :
link_type mLink ;
public :
typedef nsLineList self_type ;
typedef nsLineBox & reference ;
typedef const nsLineBox & const_reference ;
typedef nsLineBox * pointer ;
typedef const nsLineBox * const_pointer ;
typedef nsLineList_iterator iterator ;
typedef nsLineList_reverse_iterator reverse_iterator ;
typedef nsLineList_const_iterator const_iterator ;
typedef nsLineList_const_reverse_iterator const_reverse_iterator ;
nsLineList ( )
{
2009-09-30 01:34:46 +00:00
MOZ_COUNT_CTOR ( nsLineList ) ;
2001-10-25 01:08:40 +00:00
clear ( ) ;
}
2009-09-30 01:34:46 +00:00
~ nsLineList ( )
{
MOZ_COUNT_DTOR ( nsLineList ) ;
}
2001-10-25 01:08:40 +00:00
const_iterator begin ( ) const
{
const_iterator rv ;
rv . mCurrent = mLink . _mNext ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
iterator begin ( )
{
iterator rv ;
rv . mCurrent = mLink . _mNext ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
2004-03-07 18:04:24 +00:00
iterator begin ( nsLineBox * aLine )
{
iterator rv ;
rv . mCurrent = aLine ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2004-03-07 18:04:24 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
2001-10-25 01:08:40 +00:00
const_iterator end ( ) const
{
const_iterator rv ;
rv . mCurrent = & mLink ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
iterator end ( )
{
iterator rv ;
rv . mCurrent = & mLink ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
const_reverse_iterator rbegin ( ) const
{
const_reverse_iterator rv ;
rv . mCurrent = mLink . _mPrev ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
reverse_iterator rbegin ( )
{
reverse_iterator rv ;
rv . mCurrent = mLink . _mPrev ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
2010-09-09 00:15:24 +00:00
reverse_iterator rbegin ( nsLineBox * aLine )
{
reverse_iterator rv ;
rv . mCurrent = aLine ;
# ifdef DEBUG
rv . mListLink = & mLink ;
# endif
return rv ;
}
2001-10-25 01:08:40 +00:00
const_reverse_iterator rend ( ) const
{
const_reverse_iterator rv ;
rv . mCurrent = & mLink ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
reverse_iterator rend ( )
{
reverse_iterator rv ;
rv . mCurrent = & mLink ;
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
rv . mListLink = & mLink ;
# endif
return rv ;
}
2011-09-29 06:19:26 +00:00
bool empty ( ) const
2001-10-25 01:08:40 +00:00
{
return mLink . _mNext = = & mLink ;
}
// NOTE: O(N).
size_type size ( ) const
{
size_type count = 0 ;
for ( const link_type * cur = mLink . _mNext ;
cur ! = & mLink ;
cur = cur - > _mNext )
{
+ + count ;
}
return count ;
}
pointer front ( )
{
NS_ASSERTION ( ! empty ( ) , " no element to return " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mLink . _mNext ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer front ( ) const
{
NS_ASSERTION ( ! empty ( ) , " no element to return " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mLink . _mNext ) ;
2001-10-25 01:08:40 +00:00
}
pointer back ( )
{
NS_ASSERTION ( ! empty ( ) , " no element to return " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < pointer > ( mLink . _mPrev ) ;
2001-10-25 01:08:40 +00:00
}
const_pointer back ( ) const
{
NS_ASSERTION ( ! empty ( ) , " no element to return " ) ;
2007-07-08 07:08:04 +00:00
return static_cast < const_pointer > ( mLink . _mPrev ) ;
2001-10-25 01:08:40 +00:00
}
void push_front ( pointer aNew )
{
aNew - > _mNext = mLink . _mNext ;
mLink . _mNext - > _mPrev = aNew ;
aNew - > _mPrev = & mLink ;
mLink . _mNext = aNew ;
}
void pop_front ( )
// NOTE: leaves dangling next/prev pointers
{
NS_ASSERTION ( ! empty ( ) , " no element to pop " ) ;
link_type * newFirst = mLink . _mNext - > _mNext ;
newFirst - > _mPrev = & mLink ;
2012-07-30 14:20:58 +00:00
// mLink._mNext->_mNext = nullptr;
// mLink._mNext->_mPrev = nullptr;
2001-10-25 01:08:40 +00:00
mLink . _mNext = newFirst ;
}
void push_back ( pointer aNew )
{
aNew - > _mPrev = mLink . _mPrev ;
mLink . _mPrev - > _mNext = aNew ;
aNew - > _mNext = & mLink ;
mLink . _mPrev = aNew ;
}
void pop_back ( )
// NOTE: leaves dangling next/prev pointers
{
NS_ASSERTION ( ! empty ( ) , " no element to pop " ) ;
link_type * newLast = mLink . _mPrev - > _mPrev ;
newLast - > _mNext = & mLink ;
2012-07-30 14:20:58 +00:00
// mLink._mPrev->_mPrev = nullptr;
// mLink._mPrev->_mNext = nullptr;
2001-10-25 01:08:40 +00:00
mLink . _mPrev = newLast ;
}
// inserts x before position
iterator before_insert ( iterator position , pointer x )
{
// use |mCurrent| to prevent DEBUG_PASS_END assertions
x - > _mPrev = position . mCurrent - > _mPrev ;
x - > _mNext = position . mCurrent ;
position . mCurrent - > _mPrev - > _mNext = x ;
position . mCurrent - > _mPrev = x ;
return - - position ;
}
// inserts x after position
iterator after_insert ( iterator position , pointer x )
{
// use |mCurrent| to prevent DEBUG_PASS_END assertions
x - > _mNext = position . mCurrent - > _mNext ;
x - > _mPrev = position . mCurrent ;
position . mCurrent - > _mNext - > _mPrev = x ;
position . mCurrent - > _mNext = x ;
return + + position ;
}
// returns iterator pointing to after the element
iterator erase ( iterator position )
// NOTE: leaves dangling next/prev pointers
{
position - > _mPrev - > _mNext = position - > _mNext ;
position - > _mNext - > _mPrev = position - > _mPrev ;
return + + position ;
}
void swap ( self_type & y )
{
link_type tmp ( y . mLink ) ;
y . mLink = mLink ;
mLink = tmp ;
2011-04-23 01:36:23 +00:00
if ( ! empty ( ) ) {
mLink . _mNext - > _mPrev = & mLink ;
mLink . _mPrev - > _mNext = & mLink ;
}
if ( ! y . empty ( ) ) {
y . mLink . _mNext - > _mPrev = & y . mLink ;
y . mLink . _mPrev - > _mNext = & y . mLink ;
}
2001-10-25 01:08:40 +00:00
}
void clear ( )
// NOTE: leaves dangling next/prev pointers
{
mLink . _mNext = & mLink ;
mLink . _mPrev = & mLink ;
}
// inserts the conts of x before position and makes x empty
void splice ( iterator position , self_type & x )
{
// use |mCurrent| to prevent DEBUG_PASS_END assertions
position . mCurrent - > _mPrev - > _mNext = x . mLink . _mNext ;
x . mLink . _mNext - > _mPrev = position . mCurrent - > _mPrev ;
x . mLink . _mPrev - > _mNext = position . mCurrent ;
position . mCurrent - > _mPrev = x . mLink . _mPrev ;
x . clear ( ) ;
}
// Inserts element *i from list x before position and removes
// it from x.
void splice ( iterator position , self_type & x , iterator i )
{
NS_ASSERTION ( ! x . empty ( ) , " Can't insert from empty list. " ) ;
2001-10-25 20:19:32 +00:00
NS_ASSERTION ( position ! = i & & position . mCurrent ! = i - > _mNext ,
2001-10-25 01:08:40 +00:00
" We don't check for this case. " ) ;
// remove from |x|
i - > _mPrev - > _mNext = i - > _mNext ;
i - > _mNext - > _mPrev = i - > _mPrev ;
// use |mCurrent| to prevent DEBUG_PASS_END assertions
// link into |this|, before-side
i - > _mPrev = position . mCurrent - > _mPrev ;
position . mCurrent - > _mPrev - > _mNext = i . get ( ) ;
// link into |this|, after-side
i - > _mNext = position . mCurrent ;
position . mCurrent - > _mPrev = i . get ( ) ;
}
// Inserts elements in [|first|, |last|), which are in |x|,
// into |this| before |position| and removes them from |x|.
void splice ( iterator position , self_type & x , iterator first ,
iterator last )
{
NS_ASSERTION ( ! x . empty ( ) , " Can't insert from empty list. " ) ;
if ( first = = last )
return ;
- - last ; // so we now want to move [first, last]
// remove from |x|
first - > _mPrev - > _mNext = last - > _mNext ;
last - > _mNext - > _mPrev = first - > _mPrev ;
// use |mCurrent| to prevent DEBUG_PASS_END assertions
// link into |this|, before-side
first - > _mPrev = position . mCurrent - > _mPrev ;
position . mCurrent - > _mPrev - > _mNext = first . get ( ) ;
// link into |this|, after-side
last - > _mNext = position . mCurrent ;
position . mCurrent - > _mPrev = last . get ( ) ;
}
} ;
// Many of these implementations of operator= don't work yet. I don't
// know why.
2007-08-02 22:43:14 +00:00
# ifdef DEBUG
2001-10-25 01:08:40 +00:00
// NOTE: ASSIGN_FROM is meant to be used *only* as the entire body
// of a function and therefore lacks PR_{BEGIN,END}_MACRO
# define ASSIGN_FROM(other_) \
mCurrent = other_ . mCurrent ; \
mListLink = other_ . mListLink ; \
return * this ;
# else /* !NS_LINELIST_DEBUG_PASS_END */
# define ASSIGN_FROM(other_) \
mCurrent = other_ . mCurrent ; \
return * this ;
# endif /* !NS_LINELIST_DEBUG_PASS_END */
inline
nsLineList_iterator &
nsLineList_iterator : : operator = ( const nsLineList_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_iterator &
nsLineList_iterator : : operator = ( const nsLineList_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_reverse_iterator &
nsLineList_reverse_iterator : : operator = ( const nsLineList_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_reverse_iterator &
nsLineList_reverse_iterator : : operator = ( const nsLineList_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_iterator &
nsLineList_const_iterator : : operator = ( const nsLineList_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_iterator &
nsLineList_const_iterator : : operator = ( const nsLineList_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_iterator &
nsLineList_const_iterator : : operator = ( const nsLineList_const_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_iterator &
nsLineList_const_iterator : : operator = ( const nsLineList_const_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_reverse_iterator &
nsLineList_const_reverse_iterator : : operator = ( const nsLineList_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_reverse_iterator &
nsLineList_const_reverse_iterator : : operator = ( const nsLineList_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_reverse_iterator &
nsLineList_const_reverse_iterator : : operator = ( const nsLineList_const_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
inline
nsLineList_const_reverse_iterator &
nsLineList_const_reverse_iterator : : operator = ( const nsLineList_const_reverse_iterator & aOther )
{
ASSIGN_FROM ( aOther )
}
1999-05-10 22:28:49 +00:00
//----------------------------------------------------------------------
2015-03-21 16:28:04 +00:00
class nsLineIterator final : public nsILineIterator
2008-10-30 19:17:59 +00:00
{
1999-05-13 00:54:28 +00:00
public :
1999-05-10 22:28:49 +00:00
nsLineIterator ( ) ;
2008-10-30 19:17:59 +00:00
~ nsLineIterator ( ) ;
1999-05-13 00:54:28 +00:00
2015-03-21 16:28:04 +00:00
virtual void DisposeLineIterator ( ) override ;
1999-05-13 00:54:28 +00:00
2015-03-21 16:28:04 +00:00
virtual int32_t GetNumLines ( ) override ;
virtual bool GetDirection ( ) override ;
2012-08-22 15:56:38 +00:00
NS_IMETHOD GetLine ( int32_t aLineNumber ,
1999-05-13 00:54:28 +00:00
nsIFrame * * aFirstFrameOnLine ,
2012-08-22 15:56:38 +00:00
int32_t * aNumFramesOnLine ,
2015-03-21 16:28:04 +00:00
nsRect & aLineBounds ) override ;
virtual int32_t FindLineContaining ( nsIFrame * aFrame , int32_t aStartLine = 0 ) override ;
2012-08-22 15:56:38 +00:00
NS_IMETHOD FindFrameAt ( int32_t aLineNumber ,
2014-11-22 14:39:03 +00:00
nsPoint aPos ,
1999-05-13 00:54:28 +00:00
nsIFrame * * aFrameFound ,
2014-11-22 14:39:03 +00:00
bool * aPosIsBeforeFirstFrame ,
2015-03-21 16:28:04 +00:00
bool * aPosIsAfterLastFrame ) override ;
1999-05-13 00:54:28 +00:00
2015-03-21 16:28:04 +00:00
NS_IMETHOD GetNextSiblingOnLine ( nsIFrame * & aFrame , int32_t aLineNumber ) override ;
2012-08-22 15:56:38 +00:00
NS_IMETHOD CheckLineOrder ( int32_t aLine ,
2011-09-29 06:19:26 +00:00
bool * aIsReordered ,
2001-03-09 03:29:00 +00:00
nsIFrame * * aFirstVisual ,
2015-03-21 16:28:04 +00:00
nsIFrame * * aLastVisual ) override ;
2011-09-29 06:19:26 +00:00
nsresult Init ( nsLineList & aLines , bool aRightToLeft ) ;
1999-05-13 00:54:28 +00:00
2008-10-30 19:17:59 +00:00
private :
1999-05-10 22:28:49 +00:00
nsLineBox * PrevLine ( ) {
if ( 0 = = mIndex ) {
2012-07-30 14:20:58 +00:00
return nullptr ;
1999-05-10 22:28:49 +00:00
}
return mLines [ - - mIndex ] ;
}
nsLineBox * NextLine ( ) {
if ( mIndex > = mNumLines - 1 ) {
2012-07-30 14:20:58 +00:00
return nullptr ;
1999-05-10 22:28:49 +00:00
}
return mLines [ + + mIndex ] ;
}
2012-08-22 15:56:38 +00:00
nsLineBox * LineAt ( int32_t aIndex ) {
1999-05-10 22:28:49 +00:00
if ( ( aIndex < 0 ) | | ( aIndex > = mNumLines ) ) {
2012-07-30 14:20:58 +00:00
return nullptr ;
1999-05-10 22:28:49 +00:00
}
return mLines [ aIndex ] ;
}
nsLineBox * * mLines ;
2012-08-22 15:56:38 +00:00
int32_t mIndex ;
int32_t mNumLines ;
2011-09-29 06:19:26 +00:00
bool mRightToLeft ;
1999-05-10 22:28:49 +00:00
} ;
1998-12-01 16:13:49 +00:00
# endif /* nsLineBox_h___ */