Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
libcifpp
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
libcifpp
Commits
eba04950
Unverified
Commit
eba04950
authored
Dec 13, 2022
by
Maarten L. Hekkelman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimised erase II
parent
0c70df27
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
85 additions
and
38 deletions
+85
-38
include/cif++/condition.hpp
+67
-26
src/condition.cpp
+18
-12
No files found.
include/cif++/condition.hpp
View file @
eba04950
...
...
@@ -411,13 +411,13 @@ namespace detail
{
and_condition_impl
(
condition
&&
a
,
condition
&&
b
)
{
m
S
ub
.
emplace_back
(
std
::
exchange
(
a
.
m_impl
,
nullptr
));
m
S
ub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
m
_s
ub
.
emplace_back
(
std
::
exchange
(
a
.
m_impl
,
nullptr
));
m
_s
ub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
}
~
and_condition_impl
()
{
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
delete
sub
;
}
...
...
@@ -427,7 +427,7 @@ namespace detail
{
bool
result
=
true
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
if
(
sub
->
test
(
r
))
continue
;
...
...
@@ -444,7 +444,7 @@ namespace detail
os
<<
'('
;
bool
first
=
true
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
if
(
first
)
first
=
false
;
...
...
@@ -461,7 +461,7 @@ namespace detail
{
std
::
optional
<
row_handle
>
result
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
auto
s
=
sub
->
single
();
...
...
@@ -481,56 +481,97 @@ namespace detail
return
result
;
}
std
::
vector
<
condition_impl
*>
m
S
ub
;
std
::
vector
<
condition_impl
*>
m
_s
ub
;
};
struct
or_condition_impl
:
public
condition_impl
{
or_condition_impl
(
condition
&&
a
,
condition
&&
b
)
:
mA
(
nullptr
)
,
mB
(
nullptr
)
{
std
::
swap
(
mA
,
a
.
m_impl
);
std
::
swap
(
mB
,
b
.
m_impl
);
if
(
typeid
(
*
a
.
m_impl
)
==
typeid
(
*
this
))
{
or_condition_impl
*
ai
=
static_cast
<
or_condition_impl
*>
(
a
.
m_impl
);
std
::
swap
(
m_sub
,
ai
->
m_sub
);
m_sub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
}
else
if
(
typeid
(
*
b
.
m_impl
)
==
typeid
(
*
this
))
{
or_condition_impl
*
bi
=
static_cast
<
or_condition_impl
*>
(
b
.
m_impl
);
std
::
swap
(
m_sub
,
bi
->
m_sub
);
m_sub
.
emplace_back
(
std
::
exchange
(
a
.
m_impl
,
nullptr
));
}
else
{
m_sub
.
emplace_back
(
std
::
exchange
(
a
.
m_impl
,
nullptr
));
m_sub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
}
}
~
or_condition_impl
()
{
delete
mA
;
delete
mB
;
for
(
auto
sub
:
m_sub
)
delete
sub
;
}
condition_impl
*
prepare
(
const
category
&
c
)
override
;
bool
test
(
row_handle
r
)
const
override
{
return
mA
->
test
(
r
)
or
mB
->
test
(
r
);
bool
result
=
false
;
for
(
auto
sub
:
m_sub
)
{
if
(
not
sub
->
test
(
r
))
continue
;
result
=
true
;
break
;
}
return
result
;
}
void
str
(
std
::
ostream
&
os
)
const
override
{
bool
first
=
true
;
for
(
auto
sub
:
m_sub
)
{
if
(
first
)
first
=
false
;
else
os
<<
" OR "
;
os
<<
'('
;
mA
->
str
(
os
);
os
<<
") OR ("
;
mB
->
str
(
os
);
sub
->
str
(
os
);
os
<<
')'
;
}
}
virtual
std
::
optional
<
row_handle
>
single
()
const
override
{
auto
sa
=
mA
->
single
();
auto
sb
=
mB
->
single
();
std
::
optional
<
row_handle
>
result
;
for
(
auto
sub
:
m_sub
)
{
auto
s
=
sub
->
single
();
if
(
not
result
.
has_value
())
{
result
=
s
;
continue
;
}
if
(
s
==
result
)
continue
;
if
(
sa
.
has_value
()
and
sb
.
has_value
()
and
sa
!=
sb
)
sa
.
reset
();
else
if
(
not
sa
.
has_value
())
sa
=
sb
;
result
.
reset
();
break
;
}
return
sa
;
return
result
;
}
condition_impl
*
mA
;
condition_impl
*
mB
;
std
::
vector
<
condition_impl
*>
m_sub
;
};
struct
not_condition_impl
:
public
condition_impl
...
...
src/condition.cpp
View file @
eba04950
...
...
@@ -78,21 +78,21 @@ namespace detail
condition_impl
*
and_condition_impl
::
prepare
(
const
category
&
c
)
{
for
(
auto
&
sub
:
m
S
ub
)
for
(
auto
&
sub
:
m
_s
ub
)
sub
=
sub
->
prepare
(
c
);
for
(;;)
{
auto
si
=
find_if
(
m
Sub
.
begin
(),
mS
ub
.
end
(),
[](
condition_impl
*
sub
)
{
return
dynamic_cast
<
and_condition_impl
*>
(
sub
)
!=
nullptr
;
});
if
(
si
==
m
S
ub
.
end
())
auto
si
=
find_if
(
m
_sub
.
begin
(),
m_s
ub
.
end
(),
[](
condition_impl
*
sub
)
{
return
dynamic_cast
<
and_condition_impl
*>
(
sub
)
!=
nullptr
;
});
if
(
si
==
m
_s
ub
.
end
())
break
;
and_condition_impl
*
sub_and
=
static_cast
<
and_condition_impl
*>
(
*
si
);
m
S
ub
.
erase
(
si
);
m
_s
ub
.
erase
(
si
);
m
Sub
.
insert
(
mSub
.
end
(),
sub_and
->
mSub
.
begin
(),
sub_and
->
mS
ub
.
end
());
sub_and
->
m
S
ub
.
clear
();
m
_sub
.
insert
(
m_sub
.
end
(),
sub_and
->
m_sub
.
begin
(),
sub_and
->
m_s
ub
.
end
());
sub_and
->
m
_s
ub
.
clear
();
delete
sub_and
;
}
...
...
@@ -103,16 +103,21 @@ namespace detail
{
condition_impl
*
result
=
this
;
mA
=
mA
->
prepare
(
c
);
mB
=
mB
->
prepare
(
c
);
for
(
auto
&
sub
:
m_sub
)
sub
=
sub
->
prepare
(
c
);
if
(
m_sub
.
size
()
==
2
)
{
auto
a
=
m_sub
.
front
();
auto
b
=
m_sub
.
back
();
key_equals_condition_impl
*
equals
=
dynamic_cast
<
key_equals_condition_impl
*>
(
mA
);
key_is_empty_condition_impl
*
empty
=
dynamic_cast
<
key_is_empty_condition_impl
*>
(
mB
);
key_equals_condition_impl
*
equals
=
dynamic_cast
<
key_equals_condition_impl
*>
(
a
);
key_is_empty_condition_impl
*
empty
=
dynamic_cast
<
key_is_empty_condition_impl
*>
(
b
);
if
(
equals
==
nullptr
and
empty
==
nullptr
)
{
equals
=
dynamic_cast
<
key_equals_condition_impl
*>
(
mB
);
empty
=
dynamic_cast
<
key_is_empty_condition_impl
*>
(
mA
);
equals
=
dynamic_cast
<
key_equals_condition_impl
*>
(
b
);
empty
=
dynamic_cast
<
key_is_empty_condition_impl
*>
(
a
);
}
if
(
equals
!=
nullptr
and
empty
!=
nullptr
and
equals
->
m_item_tag
==
empty
->
m_item_tag
)
...
...
@@ -121,6 +126,7 @@ namespace detail
result
=
result
->
prepare
(
c
);
delete
this
;
}
}
return
result
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment