@ -427,6 +427,18 @@ gnc_option_test_book_destroy(QofBook* book)
$ 1 = s c m _ i s _ s i g n e d _ i n t e g e r ( $ input , I N T 64 _ M A X , I N T 64 _ M I N ) ;
}
% t y p e m a p ( in ) R e l a t i v e D a t e P e r i o d ( R e l a t i v e D a t e P e r i o d r d p )
{
if ( s c m _ i s _ i n t e g e r ( $ input ) )
r d p = ( R e l a t i v e D a t e P e r i o d ) s c m _ t o _ i n t ( $ input ) ;
else if ( s c m _ i s _ s y m b o l ( $ input ) )
r d p = s c m _ r e l a t i v e _ d a t e _ g e t _ p e r i o d ( $ input ) ;
else
r d p = R e l a t i v e D a t e P e r i o d : : TODAY ;
$ 1 = r d p ;
}
% t y p e m a p ( in ) R e l a t i v e D a t e P e r i o d V e c & (RelativeDatePeriodVec period_set)
{
a u t o l e n = s c m _ i s _ t r u e ( $ input ) ? s c m _ t o _ s i z e _ t ( s c m _ l e n g t h ( $ input ) ) : 0 ;
@ -626,61 +638,149 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
% header % {
static s t d : : v e c t o r < S C M > r e l d a t e _ v a l u e s { } ;
i n l i n e s i z e _ t i n d e x _ o f ( R e l a t i v e D a t e P e r i o d p e r )
{
return s t a t i c _ c a s t < s i z e _ t > ( p e r ) + 1 ;
}
static void i n i t _ r e l d a t e _ v a l u e s ( )
{
if ( ! r e l d a t e _ v a l u e s . empty ( ) )
return ;
s t d : : v e c t o r < S C M > t m p ( r e l a t i v e _ d a t e _ p e r i o d s , S C M _ B O O L _ F ) ;
using r d p = R e l a t i v e D a t e P e r i o d ;
t m p [ i n d e x _ o f ( r d p : : ABSOLUTE ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "absolute" ) ;
t m p [ i n d e x _ o f ( r d p : : TODAY ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "today" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ W E E K _ A G O ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-week-ago" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ W E E K _ A H E A D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-week-ahead" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ M O N T H _ A G O ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-month-ago" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ M O N T H _ A H E A D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-month-ahead" ) ;
t m p [ i n d e x _ o f ( r d p : : T H R E E _ M O N T H S _ A G O ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "three-months-ago" ) ;
t m p [ i n d e x _ o f ( r d p : : T H R E E _ M O N T H S _ A H E A D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "three-months-ahead" ) ;
t m p [ i n d e x _ o f ( r d p : : S I X _ M O N T H S _ A G O ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "six-months-ago" ) ;
t m p [ i n d e x _ o f ( r d p : : S I X _ M O N T H S _ A H E A D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "six-months-ahead" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ Y E A R _ A G O ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-year-ago" ) ;
t m p [ i n d e x _ o f ( r d p : : O N E _ Y E A R _ A H E A D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "one-year-ahead" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ T H I S _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-this-month" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ T H I S _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-this-month" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ P R E V _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-prev-month" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ P R E V _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-prev-month" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ N E X T _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-next-month" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ N E X T _ M O N T H ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-next-month" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ C U R R E N T _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-current-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ C U R R E N T _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-current-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ P R E V _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-prev-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ P R E V _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-prev-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ N E X T _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-next-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ N E X T _ Q U A R T E R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-next-quarter" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ C A L _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-cal-year" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ C A L _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-cal-year" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ P R E V _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-prev-year" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ P R E V _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-prev-year" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ N E X T _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-next-year" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ N E X T _ Y E A R ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-next-year" ) ;
t m p [ i n d e x _ o f ( r d p : : S T A R T _ A C C O U N T I N G _ P E R I O D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "start-accounting-period" ) ;
t m p [ i n d e x _ o f ( r d p : : E N D _ A C C O U N T I N G _ P E R I O D ) ] =
s c m _ f r o m _ u t f 8 _ s y m b o l ( "end-accounting-period" ) ;
r e l d a t e _ v a l u e s = s t d : : m o v e ( t m p ) ;
}
i n l i n e static R e l a t i v e D a t e P e r i o d s c m _ r e l a t i v e _ d a t e _ g e t _ p e r i o d ( S C M date )
{
static S C M r e l d a t e _ v a l u e s = S C M _ B O O L _ F ;
if ( s c m _ i s _ f a l s e ( r e l d a t e _ v a l u e s ) )
r e l d a t e _ v a l u e s = s c m _ c _ e v a l _ s t r i n g (
"'((absolute RelativeDatePeriod-ABSOLUTE)"
"(today RelativeDatePeriod-TODAY)"
"(one-week-ago RelativeDatePeriod-ONE-WEEK-AGO)"
"(one-week-ahead RelativeDatePeriod-ONE-WEEK-AHEAD)"
"(one-month-ago RelativeDatePeriod-ONE-MONTH-AGO)"
"(one-month-ahead RelativeDatePeriod-ONE-MONTH-AHEAD)"
"(three-months-ago RelativeDatePeriod-THREE-MONTHS-AGO)"
"(three-months-ahead RelativeDatePeriod-THREE-MONTHS-AHEAD)"
"(six-months-ago RelativeDatePeriod-SIX-MONTHS-AGO)"
"(six-months-ahead RelativeDatePeriod-SIX-MONTHS-AHEAD)"
"(one-year-ago RelativeDatePeriod-ONE-YEAR-AGO)"
"(one-year-ahead RelativeDatePeriod-ONE-YEAR-AHEAD)"
"(start-this-month RelativeDatePeriod-START-THIS-MONTH)"
"(end-this-month RelativeDatePeriod-END-THIS-MONTH)"
"(start-prev-month RelativeDatePeriod-START-PREV-MONTH)"
"(end-prev-month RelativeDatePeriod-END-PREV-MONTH)"
"(start-next-month RelativeDatePeriod-START-NEXT-MONTH)"
"(end-next-month RelativeDatePeriod-END-NEXT-MONTH)"
"(start-current-quarter RelativeDatePeriod-START-CURRENT-QUARTER)"
"(end-current-quarter RelativeDatePeriod-END-CURRENT-QUARTER)"
"(start-prev-quarter RelativeDatePeriod-START-PREV-QUARTER)"
"(end-prev-quarter RelativeDatePeriod-END-PREV-QUARTER)"
"(start-next-quarter RelativeDatePeriod-START-NEXT-QUARTER)"
"(end-next-quarter RelativeDatePeriod-END-NEXT-QUARTER)"
"(start-cal-year RelativeDatePeriod-START-CAL-YEAR)"
"(end-cal-year RelativeDatePeriod-END-CAL-YEAR)"
"(start-prev-year RelativeDatePeriod-START-PREV-YEAR)"
"(end-prev-year RelativeDatePeriod-END-PREV-YEAR)"
"(start-next-year RelativeDatePeriod-START-NEXT-YEAR)"
"(end-next-year RelativeDatePeriod-END-NEXT-YEAR)"
"(start-accounting-period RelativeDatePeriod-START-ACCOUNTING-PERIOD)"
"(end-accounting-period RelativeDatePeriod-END-ACCOUNTING-PERIOD))" ) ;
a u t o r e l d a t e _ s c m { s c m _ i s _ p a i r ( d a t e ) ? s c m _ c d r ( d a t e ) : d a t e } ;
a u t o r e l d a t e { s c m _ p r i m i t i v e _ e v a l ( s c m _ a s s q _ r e f ( r e l d a t e _ v a l u e s ,
r e l d a t e _ s c m ) ) } ;
return s t a t i c _ c a s t < R e l a t i v e D a t e P e r i o d > ( s c m _ t o _ i n t ( r e l d a t e ) ) ;
i n i t _ r e l d a t e _ v a l u e s ( ) ;
a u t o r e l d a t e _ s c m { s c m _ i s _ p a i r ( d a t e ) ? s c m _ c d r ( d a t e ) : d a t e } ;
S C M r e l d a t e _ v a l { S C M _ B O O L _ F } ;
if ( s c m _ i s _ p r o c e d u r e ( r e l d a t e _ s c m ) )
r e l d a t e _ v a l = s c m _ c a l l _ 0 ( r e l d a t e _ s c m ) ;
if ( s c m _ i s _ n u m b e r ( r e l d a t e _ s c m ) )
r e l d a t e _ v a l = r e l d a t e _ s c m ;
if ( s c m _ i s _ n u m b e r ( r e l d a t e _ v a l ) )
{
a u t o r e l d a t e _ i n d e x = s c m _ t o _ i n t ( r e l d a t e _ v a l ) ;
a s s e r t ( r e l d a t e _ i n d e x > = s t a t i c _ c a s t < int > ( R e l a t i v e D a t e P e r i o d : : ABSOLUTE ) && reldate_index < static_cast<int>(relative_date_periods - 1));
return s t a t i c _ c a s t < R e l a t i v e D a t e P e r i o d > ( r e l d a t e _ i n d e x ) ;
}
c o n s t char * r e l d a t e _ s t r ;
if ( s c m _ i s _ s y m b o l ( r e l d a t e _ s c m ) )
r e l d a t e _ s t r = s c m _ t o _ u t f 8 _ s t r i n g ( s c m _ s y m b o l _ t o _ s t r i n g ( r e l d a t e _ s c m ) ) ;
else
r e l d a t e _ s t r = s c m _ t o _ u t f 8 _ s t r i n g ( r e l d a t e _ s c m ) ;
a u t o d a t e _ i t e r =
s t d : : f i n d _ i f ( r e l d a t e _ v a l u e s . b e g i n ( ) , r e l d a t e _ v a l u e s . end ( ) ,
[ &reldate_scm](auto val)->bool {
return s c m _ i s _ e q ( v a l , r e l d a t e _ s c m ) = = 1 ;
} ) ;
if ( d a t e _ i t e r = = r e l d a t e _ v a l u e s . end ( ) )
return R e l a t i v e D a t e P e r i o d : : ABSOLUTE ;
return s t a t i c _ c a s t < R e l a t i v e D a t e P e r i o d > ( d a t e _ i t e r - r e l d a t e _ v a l u e s . b e g i n ( ) - 1 ) ;
}
i n l i n e static S C M s c m _ r e l a t i v e _ d a t e _ f r o m _ p e r i o d ( R e l a t i v e D a t e P e r i o d p e r i o d )
{
i n i t _ r e l d a t e _ v a l u e s ( ) ;
return r e l d a t e _ v a l u e s [ s t a t i c _ c a s t < s i z e _ t > ( p e r i o d ) + 1 ] ;
}
i n l i n e static b o o l s c m _ d a t e _ a b s o l u t e ( S C M date )
{
if ( s c m _ i s _ p a i r ( date ) )
{
a u t o c a r { s c m _ t o _ u t f 8 _ s t r i n g ( s c m _ s y m b o l _ t o _ s t r i n g ( s c m _ c a r ( d a t e ) ) ) } ;
if ( s t r c m p ( c a r , "relative" ) = = 0 )
return false ;
if ( s c m _ i s _ s y m b o l ( s c m _ c a r ( date ) ) )
{
a u t o c a r { s c m _ t o _ u t f 8 _ s t r i n g ( s c m _ s y m b o l _ t o _ s t r i n g ( s c m _ c a r ( d a t e ) ) ) } ;
a u t o c d r { s c m _ c d r ( d a t e ) } ;
if ( s t r c m p ( c a r , "relative" ) = = 0 )
return false ;
if ( s t r c m p ( c a r , "absolute" ) = = 0 )
return true ;
a s s e r t ( false ) ;
}
else
{
a u t o c d r { s c m _ c d r ( d a t e ) } ;
if ( s c m _ i s _ s y m b o l ( c d r ) )
return false ;
if ( s c m _ i s _ n u m b e r ( c d r ) )
return true ;
a s s e r t ( false ) ;
}
}
return true ;
return ( ! ( s c m _ i s _ s y m b o l ( date ) | | s c m _ i s _ s t r i n g ( date ) ) ) ;
}
i n l i n e static t i m e 64 s c m _ a b s o l u t e _ d a t e _ t o _ t i m e 64 ( S C M date )
@ -808,16 +908,39 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
return s c m _ c o n s ( d e s i g , s c m _ f r o m _ i n t ( v a l ) ) ;
}
static S C M
g e t _ s c m _ v a l u e ( c o n s t G n c O p t i o n D a t e V a l u e & option)
{
if ( option . g e t _ p e r i o d ( ) = = R e l a t i v e D a t e P e r i o d : : ABSOLUTE )
return s c m _ c o n s ( s c m _ f r o m _ u t f 8 _ s y m b o l ( "absolute" ) ,
s c m _ f r o m _ v a l u e ( option . g e t _ v a l u e ( ) ) ) ;
else
return s c m _ c o n s ( s c m _ f r o m _ u t f 8 _ s y m b o l ( "relative" ) ,
s c m _ r e l a t i v e _ d a t e _ f r o m _ p e r i o d ( option . g e t _ p e r i o d ( ) ) ) ;
}
static S C M
g e t _ s c m _ d e f a u l t _ v a l u e ( c o n s t G n c O p t i o n D a t e V a l u e & option)
{
if ( option . g e t _ d e f a u l t _ p e r i o d ( ) = = R e l a t i v e D a t e P e r i o d : : ABSOLUTE )
return s c m _ c o n s ( s c m _ f r o m _ u t f 8 _ s y m b o l ( "absolute" ) ,
s c m _ f r o m _ v a l u e ( option . g e t _ d e f a u l t _ v a l u e ( ) ) ) ;
else
return s c m _ c o n s ( s c m _ f r o m _ u t f 8 _ s y m b o l ( "relative" ) ,
s c m _ r e l a t i v e _ d a t e _ f r o m _ p e r i o d ( option . g e t _ d e f a u l t _ p e r i o d ( ) ) ) ;
}
t e m p l a t e < t y p e n a m e T >
s t r u c t i s _ M u l t i c h o i c e O r R a n g e
s t r u c t i s _ M u l t i c h o i c e Da t e Or R a n g e
{
static c o n s t e x p r b o o l value =
i s _ s a m e _ d e c a y e d _ v < T , G n c O p t i o n M u l t i c h o i c e V a l u e > | |
i s _ s a m e _ d e c a y e d _ v < T , G n c O p t i o n R a n g e V a l u e < int > > ;
i s _ s a m e _ d e c a y e d _ v < T , G n c O p t i o n R a n g e V a l u e < int > > | |
i s _ s a m e _ d e c a y e d _ v < T , G n c O p t i o n D a t e V a l u e > ;
} ;
t e m p l a t e < t y p e n a m e T >
i n l i n e c o n s t e x p r b o o l i s _ M u l t i c h o i c e O r R a n g e _ v = i s _ M u l t i c h o i c e O r R a n g e < T > : : value ;
i n l i n e c o n s t e x p r b o o l i s _ M u l t i c h o i c e Da t e Or R a n g e _ v = i s _ M u l t i c h o i c e D a t e O r R a n g e < T > : : value ;
t e m p l a t e < t y p e n a m e V a l u e T y p e >
i n l i n e S C M r e t u r n _ s c m _ v a l u e ( V a l u e T y p e value )
@ -853,7 +976,7 @@ inline SCM return_scm_value(ValueType value)
if ( ! $ self )
return S C M _ B O O L _ F ;
return s t d : : v i s i t ( [ ] ( c o n s t a u t o & option)->SCM {
if c o n s t e x p r ( i s _ M u l t i c h o i c e Or R a n g e _ v < d e c l t y p e ( option ) > )
if c o n s t e x p r ( i s _ M u l t i c h o i c e Da t e Or R a n g e _ v < d e c l t y p e ( option ) > )
return g e t _ s c m _ v a l u e ( option ) ;
a u t o value { o p t i o n . g e t _ v a l u e ( ) } ;
return r e t u r n _ s c m _ v a l u e ( value ) ;
@ -864,7 +987,7 @@ inline SCM return_scm_value(ValueType value)
if ( ! $ self )
return S C M _ B O O L _ F ;
return s t d : : v i s i t ( [ ] ( c o n s t a u t o & option)->SCM {
if c o n s t e x p r ( i s _ M u l t i c h o i c e Or R a n g e _ v < d e c l t y p e ( option ) > )
if c o n s t e x p r ( i s _ M u l t i c h o i c e Da t e Or R a n g e _ v < d e c l t y p e ( option ) > )
return g e t _ s c m _ d e f a u l t _ v a l u e ( option ) ;
a u t o value { o p t i o n . g e t _ d e f a u l t _ v a l u e ( ) } ;
return r e t u r n _ s c m _ v a l u e ( value ) ;