aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2006-06-22 18:39:07 +0000
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2006-06-22 18:39:07 +0000
commit3a8ce32484fe9ec430832af94d9c36fa01380ccc (patch)
tree5a880277d429c33b265a997bd9c184ea4e63c2c4
parent5155cc19468158602c5b75db9f0555c093d9a43b (diff)
downloadpaludis-3a8ce32484fe9ec430832af94d9c36fa01380ccc.tar.gz
paludis-3a8ce32484fe9ec430832af94d9c36fa01380ccc.tar.xz
Add documentation about config file formats, other misc docs improvements
-rw-r--r--doc/Makefile.am3
-rw-r--r--doc/doc_configuration_files.doxygen125
-rw-r--r--doc/header.html36
-rw-r--r--doc/paludis.css4
-rw-r--r--paludis/args/args_option.cc1
-rw-r--r--paludis/contents.hh5
-rw-r--r--paludis/default_config.cc5
-rw-r--r--paludis/util/comparison_policy_TEST.cc5
-rw-r--r--paludis/util/counted_ptr_TEST.cc8
-rw-r--r--paludis/util/destringify.hh6
-rw-r--r--paludis/util/smart_record.hh.m4145
-rw-r--r--paludis/util/smart_record_TEST.cc5
-rw-r--r--paludis/util/stringify.hh25
-rw-r--r--src/licence.hh3
14 files changed, 352 insertions, 24 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 6ca204f..a5a8b1e 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -14,7 +14,8 @@ docfiles = \
doc_changelog.doxygen \
doc_portage_differences.doxygen \
doc_news.doxygen \
- doc_security_advisories.doxygen
+ doc_security_advisories.doxygen \
+ doc_configuration_files.doxygen
EXTRA_DIST = doxygen.conf.in header.html footer.html paludis.css $(docfiles)
diff --git a/doc/doc_configuration_files.doxygen b/doc/doc_configuration_files.doxygen
new file mode 100644
index 0000000..7dbc812
--- /dev/null
+++ b/doc/doc_configuration_files.doxygen
@@ -0,0 +1,125 @@
+/* vim: set ft=cpp tw=80 sw=4 et : */
+
+/**
+\page ConfigurationFiles Configuration Files
+
+\section ConfigurationFilesOverview Overview
+
+This document explains where Paludis looks for user configuration files, and
+describes the format of these files.
+
+\section ConfigurationFilesGeneralFormat General File Format
+
+Except where otherwise noted, configuration files are plain text files where
+blank lines and lines starting with optional whitespace followed by a hash
+symbol are ignored.
+
+Many files use a key = value format. Here, any whitespace around the outside
+of key and value is stripped. The value may be quoted using single or double
+quotes. Variable expansion on previously defined keys (and sometimes on
+predefined special values) may be done using <code>${variable}</code>. To
+include a literal dollar, use <code>\$</code>.
+
+\section ConfigurationFilesLocations Locations
+
+Paludis tries the following locations for its configuration directory:
+
+- <code>${PALUDIS_HOME}/.paludis/</code>, if the <code>PALUDIS_HOME</code>
+ environment variable is set, or <code>${HOME}/.paludis/</code> otherwise.
+- <code>SYSCONFDIR/paludis/</code>, where <code>SYSCONFDIR</code> is
+ <code>/etc</code> on most systems.
+
+If the <code>--config-suffix</code> commandline argument is supplied, Paludis
+will use <code>.paludis-thesuffix</code> or <code>paludis-thesuffix</code>
+instead.
+
+If a file named <code>specpath</code> exists in this directory, Paludis uses
+this file to determine the real configuration directory. The <code>specpath</code>
+file is a standard key / value configuration file (see above). The keys that
+are used are:
+
+- <code>root</code>, which specifies the install root for packages and the
+ real configuration directory, which is <code>${root}/SYSCONFDIR/paludis/</code>
+ (note that the HOME values are <em>not</em> used here). This value is set in
+ <code>specpath</code> rather than the real configuration directory so
+ that chrooting into an image can work with no configuration changes.
+- <code>config-suffix</code>, which specifies a new configuration suffix. By
+ default, no configuration suffix is used under root.
+
+If no <code>specpath</code> file is present, the original directory is used.
+
+\section ConfigurationFilesUseConf The use.conf File
+
+User <code>USE</code> preferences are controlled by the <code>use.conf</code>
+file. The basic format of a line is <code>atom use use use ...</code>, where
+<code>atom</code> is a package depend atom or <code>*</code> for "all packages",
+and <code>use use use ...</code> is one or more USE flag names, prefixed by
+a minus if they are to be disabled.
+
+For <code>USE_EXPAND</code> variables such as <code>LINGUAS</code> and
+<code>VIDEO_CARDS</code>, <code>atom VARIABLE: value value ...</code>
+should be used.
+
+\verbatim
+# By default, apply these to all packages
+* -doc nls -apache2
+
+# Turn off nls for vim
+app-editors/vim -nls
+
+# For gvim 7, turn on and off various interpreters
+>=app-editors/gvim-7_alpha mzscheme perl -python ruby
+
+# For gtk+ with SLOT=2, enable tiff support
+x11-libs/gtk+:2 tiff
+
+# We like English
+* LINGUAS: en_GB en
+\endverbatim
+
+Note that if a package matches multiple lines, <em>all</em> of these lines will
+be considered, not just the best or last match.
+
+\section ConfigurationFilesKeywordsConf The keywords.conf File
+
+Which <code>KEYWORDS</code> to accept is controlled through
+<code>keywords.conf</code>. The format of a line is
+<code>atom keyword ...</code>. As with Portage, accepting
+<code>~arch</code> does <em>not</em> implicitly accept <code>arch</code>.
+For example:
+
+\verbatim
+# We want a mostly stable system:
+* x86
+
+# But some ~arch packages:
+dev-cpp/libebt x86 ~x86
+sys-apps/paludis x86 ~x86
+dev-util/subversion x86 ~x86
+app-admin/eselect x86 ~x86
+app-editors/vim x86 ~x86
+app-editors/vim-core x86 ~x86
+\endverbatim
+
+Note that if a package matches multiple lines, <em>all</em> of these lines will
+be considered, not just the best or last match.
+
+\section ConfigurationFilesLicensesConf The licenses.conf File
+
+Licence filtering can be controlled via <code>licenses.conf</code>. If no
+filtering is desired, use:
+
+\verbatim
+* *
+\endverbatim
+
+For filtering, the format is similar to the keywords and use files:
+
+\verbatim
+* GPL-2 BSD
+app-editors/vim-core vim
+\endverbatim
+
+*/
+
+
diff --git a/doc/header.html b/doc/header.html
index a9cab73..d45f2a1 100644
--- a/doc/header.html
+++ b/doc/header.html
@@ -6,28 +6,32 @@
<link href="$relpath$paludis.css" rel="stylesheet" type="text/css">
</head>
<body>
- <div class="qindex">Documentation: [
- <a class="qindex" href="index.html">Main&nbsp;Page</a> |
- <a class="qindex" href="modules.html">Modules</a> |
- <a class="qindex" href="namespaces.html">Namespace List</a> |
- <a class="qindex" href="annotated.html">Class&nbsp;List</a> |
- <a class="qindex" href="files.html">File&nbsp;List</a> |
- <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> |
- <a class="qindex" href="functions.html">Class&nbsp;Members</a> |
- <a class="qindex" href="globals.html">File&nbsp;Members</a> |
- <a class="qindex" href="pages.html">Other&nbsp;Topics</a> ]
- </div>
- <div class="qindex">About: [
+ <div class="qindex">About Paludis: [
+ <a class="qindex" href="index.html">Paludis&nbsp;Homepage</a> |
<a class="qindex" href="News.html">News</a> |
<a class="qindex" href="ChangeLog.html">ChangeLog</a> |
<a class="qindex" href="Licence.html">Licence</a> |
<a class="qindex" href="Authors.html">Authors</a> |
- <a class="qindex" href="CodingStandards.html">Coding&nbsp;Standards</a> |
- <a class="qindex" href="BootstrapHowto.html">Bootstrap&nbsp;Howto</a> |
- <a class="qindex" href="PortageDifferences.html">Portage&nbsp;Differences</a> |
- <a class="qindex" href="https://developer.berlios.de/projects/paludis/">Berlios&nbsp;Project&nbsp;Page</a> |
+ <a class="qindex" href="https://developer.berlios.de/projects/paludis/">Berlios&nbsp;Project</a> |
<a class="qindex" href="https://developer.berlios.de/project/showfiles.php?group_id=6360">Download</a> |
<a class="qindex" href="https://developer.berlios.de/svn/?group_id=6360">SVN</a> ]
</div>
+ <div class="qindex">User Documentation: [
+ <a class="qindex" href="BootstrapHowto.html">Bootstrap&nbsp;Howto</a> |
+ <a class="qindex" href="ConfigurationFiles.html">Configuration&nbsp;Files</a> |
+ <a class="qindex" href="PortageDifferences.html">Portage&nbsp;Differences</a> ]
+ </div>
+
+ <div class="qindex">Code Documentation: [
+ <a class="qindex" href="modules.html">Modules</a> |
+ <a class="qindex" href="namespaces.html">Namespaces</a> |
+ <a class="qindex" href="annotated.html">Classes</a> |
+ <a class="qindex" href="files.html">Files</a> |
+ <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> |
+ <a class="qindex" href="functions.html">Class&nbsp;Members</a> |
+ <a class="qindex" href="globals.html">File&nbsp;Members</a> |
+ <a class="qindex" href="CodingStandards.html">Coding&nbsp;Standards</a> |
+ <a class="qindex" href="pages.html">Other&nbsp;Topics</a> ]
+ </div>
diff --git a/doc/paludis.css b/doc/paludis.css
index 3fe883f..41d761a 100644
--- a/doc/paludis.css
+++ b/doc/paludis.css
@@ -320,3 +320,7 @@ HR { height: 1px;
border-top: 1px solid black;
}
+code {
+ background-color: #f5f5f5;
+}
+
diff --git a/paludis/args/args_option.cc b/paludis/args/args_option.cc
index 1abef9e..b7f4287 100644
--- a/paludis/args/args_option.cc
+++ b/paludis/args/args_option.cc
@@ -88,6 +88,7 @@ namespace
*/
struct ArgIs
{
+ /// The argument.
const std::string arg;
/// Constructor.
diff --git a/paludis/contents.hh b/paludis/contents.hh
index 2cc7414..82dc470 100644
--- a/paludis/contents.hh
+++ b/paludis/contents.hh
@@ -40,6 +40,11 @@ namespace paludis
struct ContentsSymEntry;
struct ContentsMiscEntry;
+ /**
+ * Visit a contents heirarchy.
+ *
+ * \ingroup grpcontents
+ */
typedef VisitorTypes<ContentsFileEntry *, ContentsDirEntry *,
ContentsSymEntry *, ContentsMiscEntry *> ContentsVisitorTypes;
diff --git a/paludis/default_config.cc b/paludis/default_config.cc
index 16d679b..aaa3d75 100644
--- a/paludis/default_config.cc
+++ b/paludis/default_config.cc
@@ -45,6 +45,11 @@ using namespace paludis;
namespace paludis
{
+ /**
+ * Implementation data for DefaultConfig.
+ *
+ * \ingroup grpdefaultconfig
+ */
template<>
struct Implementation<DefaultConfig> :
InternalCounted<DefaultConfig>,
diff --git a/paludis/util/comparison_policy_TEST.cc b/paludis/util/comparison_policy_TEST.cc
index 6803ef7..62daae0 100644
--- a/paludis/util/comparison_policy_TEST.cc
+++ b/paludis/util/comparison_policy_TEST.cc
@@ -28,6 +28,11 @@ using namespace test;
namespace test_cases
{
+ /**
+ * Test comparisons.
+ *
+ * \ingroup grptestcases
+ */
struct ComparisonTest : TestCase
{
ComparisonTest() : TestCase("comparison") { }
diff --git a/paludis/util/counted_ptr_TEST.cc b/paludis/util/counted_ptr_TEST.cc
index b07cb29..2a2ba94 100644
--- a/paludis/util/counted_ptr_TEST.cc
+++ b/paludis/util/counted_ptr_TEST.cc
@@ -38,7 +38,8 @@ namespace
*
* \ingroup grptestcases
*/
- class MyClass : public InternalCounted<MyClass>
+ class MyClass :
+ public InternalCounted<MyClass>
{
private:
int _v;
@@ -73,6 +74,11 @@ namespace
};
}
+/**
+ * Test InternalCounted class is stringifiable.
+ *
+ * \ingroup grptestcases
+ */
std::ostream & operator<< (std::ostream & s, const MyClass & c)
{
s << c.value();
diff --git a/paludis/util/destringify.hh b/paludis/util/destringify.hh
index 183d305..1303de7 100644
--- a/paludis/util/destringify.hh
+++ b/paludis/util/destringify.hh
@@ -139,12 +139,6 @@ namespace paludis
return destringify_internals::Destringifier<Type_, Exception_>::do_destringify(s);
}
- /**
- * Extract a value of some type from a string (overload with a default
- * exception of DestringifyError).
- *
- * \ingroup grpdestringify
- */
template <typename Type_>
Type_ destringify(const std::string & s)
{
diff --git a/paludis/util/smart_record.hh.m4 b/paludis/util/smart_record.hh.m4
index 2c78303..7718f44 100644
--- a/paludis/util/smart_record.hh.m4
+++ b/paludis/util/smart_record.hh.m4
@@ -124,6 +124,12 @@ namespace paludis
struct SmartRecordKey;
forloop(`idx', `0', max_record_size, `
+ /**
+ * Provides the key information typedefs for a MakeSmartRecord
+ * instantiation.
+ *
+ * \ingroup grprecords
+ */
template <typename T_>
struct SmartRecordKey<`'idx`', T_>
{
@@ -138,47 +144,92 @@ forloop(`idx', `0', max_record_size, `
*/
namespace smart_record_internals
{
+ /**
+ * Internal use by SmartRecord: turn a string literal into a string.
+ *
+ * \ingroup grprecords
+ */
template <typename T_>
struct CharStarToString
{
+ /// Our type, unconverted.
typedef T_ Type;
};
+ /**
+ * Internal use by SmartRecord: turn a string literal into a string.
+ *
+ * \ingroup grprecords
+ */
template <unsigned i_>
struct CharStarToString<char [i_]>
{
+ /// We are a string.
typedef std::string Type;
};
+ /**
+ * Internal use by SmartRecord: turn a string literal into a string.
+ *
+ * \ingroup grprecords
+ */
template <unsigned i_>
struct CharStarToString<const char [i_]>
{
+ /// We are a string.
typedef std::string Type;
};
+ /**
+ * Internal use by SmartRecord: turn a string literal into a string.
+ *
+ * \ingroup grprecords
+ */
template <>
struct CharStarToString<char *>
{
+ /// We are a string.
typedef std::string Type;
};
+ /**
+ * Internal use by SmartRecord: tail of a list.
+ *
+ * \ingroup grprecords
+ */
struct ParamListTail
{
+ /// We have no children.
static const unsigned list_length = 0;
};
+ /**
+ * Internal use by SmartRecord: a list of parameters.
+ *
+ * \ingroup grprecords
+ */
template <unsigned left_idx_, typename L_, typename R_>
struct ParamList
{
+ /// Our left index.
static const unsigned left_idx = left_idx_;
+
+ /// Our left item.
L_ left;
+
+ /// Type of our left item.
typedef L_ LeftType;
+ /// Our right item.
R_ right;
+
+ /// Type of our right item.
typedef R_ RightType;
+ /// How long are we?
static const unsigned list_length = 1 + RightType::list_length;
+ /// Constructor.
ParamList(const L_ & l, const R_ & r) :
left(l),
right(r)
@@ -190,9 +241,19 @@ forloop(`idx', `0', max_record_size, `
Result_
find_list_entry(const ParamList<left_idx_, L_, R_> & list);
+ /**
+ * Find a list entry.
+ *
+ * \ingroup grprecords
+ */
template <bool is_left, unsigned idx_, typename Result_, unsigned left_idx_, typename L_, typename R_>
struct FindListEntry;
+ /**
+ * Find a list entry.
+ *
+ * \ingroup grprecords
+ */
template <unsigned idx_, typename Result_, unsigned left_idx_, typename L_, typename R_>
struct FindListEntry<true, idx_, Result_, left_idx_, L_, R_>
{
@@ -202,6 +263,11 @@ forloop(`idx', `0', max_record_size, `
}
};
+ /**
+ * Find a list entry.
+ *
+ * \ingroup grprecords
+ */
template <unsigned idx_, typename Result_, unsigned left_idx_, typename L_, typename R_>
struct FindListEntry<false, idx_, Result_, left_idx_, L_, R_>
{
@@ -211,6 +277,11 @@ forloop(`idx', `0', max_record_size, `
}
};
+ /**
+ * Find a list entry.
+ *
+ * \ingroup grprecords
+ */
template <unsigned idx_, typename Result_, unsigned left_idx_, typename L_, typename R_>
Result_
find_list_entry(const ParamList<left_idx_, L_, R_> & list)
@@ -218,18 +289,32 @@ forloop(`idx', `0', max_record_size, `
return FindListEntry<left_idx_ == idx_, idx_, Result_, left_idx_, L_, R_>()(list);
}
+ /**
+ * A node in a param list.
+ *
+ * \ingroup grprecords
+ */
template <unsigned idx_, typename T_>
struct ParamListNode
{
+ /// Our item.
T_ value;
+
+ /// Our index.
static const unsigned idx = idx_;
+ /// Constructor.
ParamListNode(const T_ & t) :
value(t)
{
}
};
+ /**
+ * Join param nodes.
+ *
+ * \ingroup grprecords
+ */
template <unsigned left_idx_, typename T_, unsigned right_idx_, typename U_>
ParamList<left_idx_, T_, ParamList<right_idx_, U_, ParamListTail> >
operator, (const ParamListNode<left_idx_, T_> & t, const ParamListNode<right_idx_, U_> & u)
@@ -238,6 +323,11 @@ forloop(`idx', `0', max_record_size, `
ParamList<right_idx_, U_, ParamListTail>(u.value, ParamListTail()));
}
+ /**
+ * Join param nodes.
+ *
+ * \ingroup grprecords
+ */
template <unsigned left_idx_, typename T_, typename U_, unsigned right_idx_, typename V_>
ParamList<left_idx_, V_, ParamList<right_idx_, T_, U_> >
operator, (const ParamList<right_idx_, T_, U_> & t, const ParamListNode<left_idx_, V_> & u)
@@ -249,6 +339,11 @@ forloop(`idx', `0', max_record_size, `
struct GetRecordKeyType;
forloop(`idx', `0', max_record_size, `
+ /**
+ * Get the type of a particular key in a record.
+ *
+ * \ingroup grprecords
+ */
template <typename Tag_>
struct GetRecordKeyType<Tag_, `'idx`'>
{
@@ -266,21 +361,35 @@ forloop(`idx', `0', max_record_size, `
struct RecordKeyPointerGetter;
forloop(`idx', `0', max_record_size, `
+ /**
+ * Handle fetching a record key.
+ *
+ * \ingroup grprecords
+ */
template <typename Tag_, unsigned key_count_>
struct RecordKeyGetter<Tag_, key_count_, `'idx`'>
{
+ /**
+ * Fetch, const.
+ */
static const typename GetRecordKeyType<Tag_, `'idx`'>::Type &
do_get(const RecordBase<Tag_, key_count_> & r)
{
return r._v`'idx`';
}
+ /**
+ * Fetch, non const.
+ */
static typename GetRecordKeyType<Tag_, `'idx`'>::Type &
do_get(RecordBase<Tag_, key_count_> & r)
{
return r._v`'idx`';
}
+ /**
+ * Set.
+ */
static void
do_set(RecordBase<Tag_, key_count_> & r,
const typename GetRecordKeyType<Tag_, `'idx`'>::Type & v)
@@ -479,6 +588,11 @@ forloop(`idx', `0', max_record_size, `
};
forloop(`idx', `1', max_record_size, `
+ /**
+ * Base class for a SmartRecord.
+ *
+ * \ingroup grprecords
+ */
template<typename Tag_>
class RecordBase<Tag_, `'idx`'> : public RecordComparisonBase<Tag_, `'idx`',
typename Tag_::ComparisonModeTag,
@@ -495,8 +609,10 @@ forloop(`idy', `0', decr(`'idx`'), `
')
public:
+ /// Destructor.
~RecordBase();
+ /// Constructor, from raw parameters.
RecordBase(
ifelse(idx, `1', `', `forloop(`idy', `0', decr(decr(idx)), `
const typename Tag_::KeyType`'idy`' & p`'idy`',
@@ -510,6 +626,7 @@ ifelse(idx, `1', `', `forloop(`idy', `0', decr(decr(idx)), `
{
}
+ /// Copy constructor.
RecordBase(const RecordBase<Tag_, `'idx`'> & other) :
RecordComparisonBase<Tag_, `'idx`', typename Tag_::ComparisonModeTag,
typename Tag_::ComparisonMethodTag>(other),
@@ -520,6 +637,7 @@ ifelse(idx, `1', `', `forloop(`idy', `0', decr(decr(idx)), `
{
}
+ /// Assignment.
const RecordBase & operator= (const RecordBase<Tag_, `'idx`'> & other)
{
forloop(`idy', `0', decr(idx), `
@@ -528,30 +646,36 @@ forloop(`idy', `0', decr(idx), `
return *this;
}
+ /// Fetch a key type.
template <typename Tag_::Keys k_>
struct GetKeyType
{
+ /// The key type.
typedef typename GetRecordKeyType<Tag_, k_>::Type Type;
};
+ /// Fetch an item.
template <typename Tag_::Keys k_>
const typename GetRecordKeyType<Tag_, k_>::Type & get() const
{
return RecordKeyGetter<Tag_, `'idx`', k_>::do_get(*this);
}
+ /// Fetch an item.
template <typename Tag_::Keys k_>
typename GetRecordKeyType<Tag_, k_>::Type & get()
{
return RecordKeyGetter<Tag_, `'idx`', k_>::do_get(*this);
}
+ /// Set an item.
template <typename Tag_::Keys k_>
void set(const typename GetRecordKeyType<Tag_, k_>::Type & v)
{
return RecordKeyGetter<Tag_, `'idx`', k_>::do_set(*this, v);
}
+ /// Named parameters constructor.
template <typename List_>
static RecordBase
create(const List_ & list)
@@ -572,9 +696,17 @@ ifelse(idx, `1', `', `forloop(`idy', `0', decr(decr(idx)), `
')
forloop(`idx', `0', max_record_size, `
+ /**
+ * Fetch a pointer to a record key.
+ *
+ * \ingroup grprecords
+ */
template <typename Tag_, unsigned key_count_>
struct RecordKeyPointerGetter<Tag_, key_count_, `'idx`'>
{
+ /**
+ * Fetch the pointer.
+ */
static typename GetRecordKeyType<Tag_, `'idx>::Type
RecordBase<Tag_, key_count_>::* do_get_pointer()
{
@@ -623,9 +755,16 @@ forloop(`idx', `0', max_record_size, `
struct DoFullCompareByAll;
forloop(`idx', `1', max_record_size, `
+ /**
+ * Mixin class for SmartRecord instances that are compared by all
+ * keys in order.
+ *
+ * \ingroup grprecords
+ */
template <typename Tag_>
struct DoFullCompareByAll<Tag_, `'idx`'>
{
+ /// Do the comparison.
static int do_compare(const RecordBase<Tag_, `'idx`'> * const a,
const RecordBase<Tag_, `'idx`'> * const b)
{
@@ -653,6 +792,12 @@ forloop(`idy', `0', decr(`'idx`'), `
struct DoEqualCompareByAll;
forloop(`idx', `1', max_record_size, `
+ /**
+ * Mixin class for SmartRecord instances that are equal-compared by all
+ * keys in order.
+ *
+ * \ingroup grprecords
+ */
template <typename Tag_>
struct DoEqualCompareByAll<Tag_, `'idx`'>
{
diff --git a/paludis/util/smart_record_TEST.cc b/paludis/util/smart_record_TEST.cc
index 589073c..e24e342 100644
--- a/paludis/util/smart_record_TEST.cc
+++ b/paludis/util/smart_record_TEST.cc
@@ -142,6 +142,11 @@ namespace test_cases
}
} test_list_constructed_record;
+ /**
+ * \test Test a SmartRecord of pairs of items.
+ *
+ * \ingroup grptestcases
+ */
struct PairTest : TestCase
{
PairTest() : TestCase("pair") { }
diff --git a/paludis/util/stringify.hh b/paludis/util/stringify.hh
index f2cb1f6..95ade48 100644
--- a/paludis/util/stringify.hh
+++ b/paludis/util/stringify.hh
@@ -42,25 +42,50 @@ namespace paludis
*/
namespace stringify_internals
{
+ /**
+ * Check that T_ is a sane type to be stringified.
+ *
+ * \ingroup grpstringify
+ */
template <typename T_>
struct CheckType
{
+ /// Yes, we are a sane type.
enum { value = 0 } Value;
};
+ /**
+ * Check that T_ is a sane type to be stringified, which it isn't
+ * if it's a pointer unless it's a char * pointer.
+ *
+ * \ingroup grpstringify
+ */
template <typename T_>
struct CheckType<T_ *>
{
};
+ /**
+ * Check that T_ is a sane type to be stringified, which it isn't
+ * if it's a CountedPtr.
+ *
+ * \ingroup grpstringify
+ */
template <typename T_, typename U_, typename V_>
struct CheckType<CountedPtr<T_, U_, V_> >
{
};
+ /**
+ * Check that T_ is a sane type to be stringified, which it isn't
+ * if it's a pointer unless it's a char * pointer.
+ *
+ * \ingroup grpstringify
+ */
template <>
struct CheckType<char *>
{
+ /// Yes, we are a sane type.
enum { value = 0 } Value;
};
}
diff --git a/src/licence.hh b/src/licence.hh
index 366aa57..df3cae7 100644
--- a/src/licence.hh
+++ b/src/licence.hh
@@ -23,6 +23,9 @@
#include <paludis/paludis.hh>
#include <iosfwd>
+/**
+ * Display licences.
+ */
struct LicenceDisplayer :
paludis::DepAtomVisitorTypes::ConstVisitor
{