Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-common
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Timo Koch
dune-common
Commits
84638808
Commit
84638808
authored
14 years ago
by
Jorrit Fahlke
Browse files
Options
Downloads
Patches
Plain Diff
[NullPointerInitializer] Make it work with native tuples (C++0x).
[[Imported from SVN: r6068]]
parent
0740b46a
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dune/common/utility.hh
+127
-102
127 additions, 102 deletions
dune/common/utility.hh
with
127 additions
and
102 deletions
dune/common/utility.hh
+
127
−
102
View file @
84638808
...
...
@@ -3,6 +3,8 @@
#ifndef DUNE_UTILITY_HH
#define DUNE_UTILITY_HH
#include
<dune/common/static_assert.hh>
#include
"tuples.hh"
namespace
Dune
{
...
...
@@ -25,122 +27,145 @@ namespace Dune {
* in a class which you can only initialise in a later stage.
*/
template
<
class
Tuple
>
class
NullPointerInitialiser
{};
class
NullPointerInitialiser
{
dune_static_assert
(
AlwaysFalse
<
Tuple
>::
value
,
"Attempt to use the "
"unspecialized version of NullPointerInitialiser. "
"NullPointerInitialiser needs to be specialized for "
"each possible tuple size. Naturally the number of "
"pre-defined specializations is limited arbitrarily. "
"Maybe you need to raise this limit by defining some "
"more specializations? Also check that the tuple this "
"is applied to really is a tuple of pointers only."
);
public:
//! export the type of the tuples
typedef
Tuple
ResultType
;
//! generate a zero-initialized tuple
static
ResultType
apply
();
};
namespace
#ifndef DOXYGEN
template
<
class
Tuple
>
struct
NullPointerInitialiser
<
const
Tuple
>
:
public
NullPointerInitialiser
<
Tuple
>
{
/**
* @brief Helper class for initialising null pointers.
*
* First template parameter is the tuple.
* Second templates parameter is the size of the tuple.
*/
template
<
class
T
,
int
size
>
struct
InitialiserHelper
{};
typedef
const
Tuple
ResultType
;
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
,
1
>
{
static
inline
tuple
<
T1
*
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
(
0
);
}
};
template
<
>
struct
NullPointerInitialiser
<
tuple
<>
>
{
typedef
tuple
<>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
();
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
,
2
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
(
0
,
0
);
}
};
template
<
class
T0
>
struct
NullPointerInitialiser
<
tuple
<
T0
*>
>
{
typedef
tuple
<
T0
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
));
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
,
3
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
(
0
,
0
,
0
);
}
};
template
<
class
T0
,
class
T1
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*>
>
{
typedef
tuple
<
T0
*
,
T1
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
));
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
,
T6
,
T7
,
T8
,
T9
>
,
4
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
,
T6
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
,
T6
,
T7
,
T8
,
T9
>
(
0
,
0
,
0
,
0
);
}
};
template
<
class
T0
,
class
T1
,
class
T2
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
));
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
,
T7
,
T8
,
T9
>
,
5
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
,
T7
,
T8
,
T9
>
(
0
,
0
,
0
,
0
,
0
);
}
};
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
));
}
};
template
<
typename
T
1
,
typename
T
2
,
typename
T
3
,
typename
T
4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
,
T8
,
T9
>
,
6
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
,
T8
,
T9
>
(
0
,
0
,
0
,
0
,
0
,
0
);
}
};
template
<
class
T
0
,
class
T
1
,
class
T
2
,
class
T
3
,
class
T4
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
)
);
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
,
T9
>
,
7
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
,
T9
>
(
0
,
0
,
0
,
0
,
0
,
0
,
0
);
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
>
,
8
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
>
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
);
}
};
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
,
class
T4
,
class
T5
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
),
static_cast
<
T5
*>
(
0
));
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
struct
InitialiserHelper
<
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
*>
,
9
>
{
static
inline
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
*>
apply
()
{
return
tuple
<
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
*>
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
);
}
};
}
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
,
class
T4
,
class
T5
,
class
T6
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
),
static_cast
<
T5
*>
(
0
),
static_cast
<
T6
*>
(
0
));
}
};
template
<
typename
T1
,
typename
T2
,
typename
T3
,
typename
T4
,
typename
T5
,
typename
T6
,
typename
T7
,
typename
T8
,
typename
T9
>
class
NullPointerInitialiser
<
tuple
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
>
{
public:
typedef
tuple
<
T1
,
T2
,
T3
,
T4
,
T5
,
T6
,
T7
,
T8
,
T9
>
ResultType
;
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
,
class
T4
,
class
T5
,
class
T6
,
class
T7
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
),
static_cast
<
T5
*>
(
0
),
static_cast
<
T6
*>
(
0
),
static_cast
<
T7
*>
(
0
));
}
};
static
inline
ResultType
apply
()
{
return
InitialiserHelper
<
ResultType
,
tuple_size
<
ResultType
>::
value
>::
apply
();
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
,
class
T4
,
class
T5
,
class
T6
,
class
T7
,
class
T8
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
),
static_cast
<
T5
*>
(
0
),
static_cast
<
T6
*>
(
0
),
static_cast
<
T7
*>
(
0
),
static_cast
<
T8
*>
(
0
));
}
};
template
<
class
T0
,
class
T1
,
class
T2
,
class
T3
,
class
T4
,
class
T5
,
class
T6
,
class
T7
,
class
T8
,
class
T9
>
struct
NullPointerInitialiser
<
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
*>
>
{
typedef
tuple
<
T0
*
,
T1
*
,
T2
*
,
T3
*
,
T4
*
,
T5
*
,
T6
*
,
T7
*
,
T8
*
,
T9
*>
ResultType
;
static
ResultType
apply
()
{
return
ResultType
(
static_cast
<
T0
*>
(
0
),
static_cast
<
T1
*>
(
0
),
static_cast
<
T2
*>
(
0
),
static_cast
<
T3
*>
(
0
),
static_cast
<
T4
*>
(
0
),
static_cast
<
T5
*>
(
0
),
static_cast
<
T6
*>
(
0
),
static_cast
<
T7
*>
(
0
),
static_cast
<
T8
*>
(
0
),
static_cast
<
T9
*>
(
0
));
}
};
#endif // !defined(DOXYGEN)
/**
* @brief Deletes all objects pointed to in a tuple of pointers.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment