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
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
97 additions
and
50 deletions
+97
-50
include/cif++/condition.hpp
+70
-29
src/condition.cpp
+27
-21
No files found.
include/cif++/condition.hpp
View file @
eba04950
...
@@ -411,13 +411,13 @@ namespace detail
...
@@ -411,13 +411,13 @@ namespace detail
{
{
and_condition_impl
(
condition
&&
a
,
condition
&&
b
)
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
(
a
.
m_impl
,
nullptr
));
m
S
ub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
m
_s
ub
.
emplace_back
(
std
::
exchange
(
b
.
m_impl
,
nullptr
));
}
}
~
and_condition_impl
()
~
and_condition_impl
()
{
{
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
delete
sub
;
delete
sub
;
}
}
...
@@ -427,7 +427,7 @@ namespace detail
...
@@ -427,7 +427,7 @@ namespace detail
{
{
bool
result
=
true
;
bool
result
=
true
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
{
if
(
sub
->
test
(
r
))
if
(
sub
->
test
(
r
))
continue
;
continue
;
...
@@ -444,7 +444,7 @@ namespace detail
...
@@ -444,7 +444,7 @@ namespace detail
os
<<
'('
;
os
<<
'('
;
bool
first
=
true
;
bool
first
=
true
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
{
if
(
first
)
if
(
first
)
first
=
false
;
first
=
false
;
...
@@ -461,7 +461,7 @@ namespace detail
...
@@ -461,7 +461,7 @@ namespace detail
{
{
std
::
optional
<
row_handle
>
result
;
std
::
optional
<
row_handle
>
result
;
for
(
auto
sub
:
m
S
ub
)
for
(
auto
sub
:
m
_s
ub
)
{
{
auto
s
=
sub
->
single
();
auto
s
=
sub
->
single
();
...
@@ -481,56 +481,97 @@ namespace detail
...
@@ -481,56 +481,97 @@ namespace detail
return
result
;
return
result
;
}
}
std
::
vector
<
condition_impl
*>
m
S
ub
;
std
::
vector
<
condition_impl
*>
m
_s
ub
;
};
};
struct
or_condition_impl
:
public
condition_impl
struct
or_condition_impl
:
public
condition_impl
{
{
or_condition_impl
(
condition
&&
a
,
condition
&&
b
)
or_condition_impl
(
condition
&&
a
,
condition
&&
b
)
:
mA
(
nullptr
)
,
mB
(
nullptr
)
{
{
std
::
swap
(
mA
,
a
.
m_impl
);
if
(
typeid
(
*
a
.
m_impl
)
==
typeid
(
*
this
))
std
::
swap
(
mB
,
b
.
m_impl
);
{
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
()
~
or_condition_impl
()
{
{
delete
mA
;
for
(
auto
sub
:
m_sub
)
delete
mB
;
delete
sub
;
}
}
condition_impl
*
prepare
(
const
category
&
c
)
override
;
condition_impl
*
prepare
(
const
category
&
c
)
override
;
bool
test
(
row_handle
r
)
const
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
void
str
(
std
::
ostream
&
os
)
const
override
{
{
os
<<
'('
;
bool
first
=
true
;
mA
->
str
(
os
);
for
(
auto
sub
:
m_sub
)
os
<<
") OR ("
;
{
mB
->
str
(
os
);
if
(
first
)
os
<<
')'
;
first
=
false
;
else
os
<<
" OR "
;
os
<<
'('
;
sub
->
str
(
os
);
os
<<
')'
;
}
}
}
virtual
std
::
optional
<
row_handle
>
single
()
const
override
virtual
std
::
optional
<
row_handle
>
single
()
const
override
{
{
auto
sa
=
mA
->
single
();
std
::
optional
<
row_handle
>
result
;
auto
sb
=
mB
->
single
();
if
(
sa
.
has_value
()
and
sb
.
has_value
()
and
sa
!=
sb
)
sa
.
reset
();
else
if
(
not
sa
.
has_value
())
sa
=
sb
;
return
sa
;
for
(
auto
sub
:
m_sub
)
{
auto
s
=
sub
->
single
();
if
(
not
result
.
has_value
())
{
result
=
s
;
continue
;
}
if
(
s
==
result
)
continue
;
result
.
reset
();
break
;
}
return
result
;
}
}
condition_impl
*
mA
;
std
::
vector
<
condition_impl
*>
m_sub
;
condition_impl
*
mB
;
};
};
struct
not_condition_impl
:
public
condition_impl
struct
not_condition_impl
:
public
condition_impl
...
...
src/condition.cpp
View file @
eba04950
...
@@ -78,21 +78,21 @@ namespace detail
...
@@ -78,21 +78,21 @@ namespace detail
condition_impl
*
and_condition_impl
::
prepare
(
const
category
&
c
)
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
);
sub
=
sub
->
prepare
(
c
);
for
(;;)
for
(;;)
{
{
auto
si
=
find_if
(
m
Sub
.
begin
(),
mS
ub
.
end
(),
[](
condition_impl
*
sub
)
{
return
dynamic_cast
<
and_condition_impl
*>
(
sub
)
!=
nullptr
;
});
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
())
if
(
si
==
m
_s
ub
.
end
())
break
;
break
;
and_condition_impl
*
sub_and
=
static_cast
<
and_condition_impl
*>
(
*
si
);
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
());
m
_sub
.
insert
(
m_sub
.
end
(),
sub_and
->
m_sub
.
begin
(),
sub_and
->
m_s
ub
.
end
());
sub_and
->
m
S
ub
.
clear
();
sub_and
->
m
_s
ub
.
clear
();
delete
sub_and
;
delete
sub_and
;
}
}
...
@@ -103,23 +103,29 @@ namespace detail
...
@@ -103,23 +103,29 @@ namespace detail
{
{
condition_impl
*
result
=
this
;
condition_impl
*
result
=
this
;
mA
=
mA
->
prepare
(
c
);
for
(
auto
&
sub
:
m_sub
)
mB
=
mB
->
prepare
(
c
);
sub
=
sub
->
prepare
(
c
);
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
);
if
(
equals
==
nullptr
and
empty
==
nullptr
)
{
equals
=
dynamic_cast
<
key_equals_condition_impl
*>
(
mB
);
empty
=
dynamic_cast
<
key_is_empty_condition_impl
*>
(
mA
);
}
if
(
equals
!=
nullptr
and
empty
!=
nullptr
and
equals
->
m_item_tag
==
empty
->
m_item_tag
)
if
(
m_sub
.
size
()
==
2
)
{
{
result
=
new
detail
::
key_equals_or_empty_condition_impl
(
equals
);
auto
a
=
m_sub
.
front
();
result
=
result
->
prepare
(
c
);
auto
b
=
m_sub
.
back
();
delete
this
;
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
*>
(
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
)
{
result
=
new
detail
::
key_equals_or_empty_condition_impl
(
equals
);
result
=
result
->
prepare
(
c
);
delete
this
;
}
}
}
return
result
;
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