summaryrefslogtreecommitdiffstats
path: root/src/include/usr/targeting/common/predicates
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/usr/targeting/common/predicates')
-rw-r--r--src/include/usr/targeting/common/predicates/predicatebase.H133
-rw-r--r--src/include/usr/targeting/common/predicates/predicatectm.H189
-rw-r--r--src/include/usr/targeting/common/predicates/predicateisfunctional.H106
-rw-r--r--src/include/usr/targeting/common/predicates/predicatepostfixexpr.H231
-rw-r--r--src/include/usr/targeting/common/predicates/predicates.H41
5 files changed, 700 insertions, 0 deletions
diff --git a/src/include/usr/targeting/common/predicates/predicatebase.H b/src/include/usr/targeting/common/predicates/predicatebase.H
new file mode 100644
index 000000000..1a12b16a6
--- /dev/null
+++ b/src/include/usr/targeting/common/predicates/predicatebase.H
@@ -0,0 +1,133 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/targeting/predicates/predicatebase.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+
+#ifndef __TARGETING_COMMON_PREDICATEBASE_H
+#define __TARGETING_COMMON_PREDICATEBASE_H
+
+/**
+ * @file targeting/common/predicates/predicatebase.H
+ *
+ * @brief Interface for an abstract targeting predicate which filters a set of
+ * targets based on the programmed criteria. Concrete predicates must
+ * provide the interface specified here.
+ */
+
+//******************************************************************************
+// Includes
+//******************************************************************************
+
+// STD
+
+// Other Host Boot Components
+
+// Targeting Component
+
+//******************************************************************************
+// Macros
+//******************************************************************************
+
+/**
+ * @brief Disable copy constructor / assignment operators
+ */
+#undef TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS
+#define TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS(Type) \
+ Type(const Type& i_other); \
+ Type& operator=(const Type& i_other)
+
+/**
+ * @brief Ensure trace macros are undefined
+ */
+#undef TARG_NAMESPACE
+#undef TARG_CLASS
+#undef TARG_FN
+
+//******************************************************************************
+// Interface
+//******************************************************************************
+
+namespace TARGETING
+{
+
+#define TARG_NAMESPACE "TARGETING::"
+#define TARG_CLASS "PredicateBase::"
+
+class Target;
+
+/**
+ * @brief Abstract predicate class which specifies an interface for all
+ * concrete predicates. A predicate acts as a filter on a set of targets.
+ */
+class PredicateBase
+{
+ public:
+
+ /**
+ * @brief Destroys the predicate base class (nothing to do)
+ */
+ virtual ~PredicateBase();
+
+ /**
+ * @brief Predicate function call interface
+ *
+ * @par Detailed Description:
+ * This abstract interface must be declared/implemented by all
+ * derived predicates. A concrete version of this function accepts
+ * a target, applies the associated predicate logic, and returns
+ * whether the target met the predicate criteria or not. Caller
+ * must always supply a valid Target*, or routine will assert.
+ *
+ * @param[in] i_pTarget Pointer to target to apply predicate to
+ *
+ * @return Boolean indicating whether target matches criteria specified
+ * by the concrete predicate
+ *
+ * @retval true Target matches the predicate criteria
+ * @retval false Target does not match the predicate criteria
+ */
+ virtual bool operator()(
+ const Target* i_pTarget) const = 0;
+
+ protected:
+
+ /**
+ * @brief Create the predicate base class (nothing to do)
+ *
+ * @note Constructor protected to allow access from the derived class
+ */
+ PredicateBase()
+ {
+ #define TARG_FN "PredicateBase()"
+ #undef TARG_FN
+ }
+
+ private:
+
+ TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS(PredicateBase);
+};
+
+#undef TARG_CLASS
+#undef TARG_NAMESPACE
+
+} // End namespace TARGETING
+
+#endif // __TARGETING_COMMON_PREDICATEBASE_H
diff --git a/src/include/usr/targeting/common/predicates/predicatectm.H b/src/include/usr/targeting/common/predicates/predicatectm.H
new file mode 100644
index 000000000..de1e5f48f
--- /dev/null
+++ b/src/include/usr/targeting/common/predicates/predicatectm.H
@@ -0,0 +1,189 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/targeting/predicates/predicatectm.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+
+#ifndef __TARGETING_COMMON_PREDICATECTM_H
+#define __TARGETING_COMMON_PREDICATECTM_H
+
+/**
+ * @file targeting/common/predicates/predicatectm.H
+ *
+ * @brief Interface for a predicate which fiters a target based on its class,
+ * type, and model.
+ */
+
+//******************************************************************************
+// Includes
+//******************************************************************************
+
+// STD
+
+// Other Host Boot Components
+
+// Targeting Component
+#include <targeting/common/target.H>
+#include <targeting/common/attributes.H>
+#include <targeting/common/predicates/predicatebase.H>
+
+//******************************************************************************
+// Macros
+//******************************************************************************
+
+#undef TARG_NAMESPACE
+#undef TARG_CLASS
+#undef TARG_FN
+
+//******************************************************************************
+// Interface
+//******************************************************************************
+
+namespace TARGETING
+{
+
+#define TARG_NAMESPACE "TARGETING::"
+#define TARG_CLASS "PredicateCTM::"
+
+class Target;
+
+/**
+ * @brief Predicate class which filters a target based on its class, type,
+ * and model
+ */
+class PredicateCTM : public PredicateBase
+{
+ public:
+
+ /**
+ * @brief Create a target class, type, model predicate
+ *
+ * @param[in] i_class Class of matching target, default NA (any)
+ * @param[in] i_type Type of matching target, default NA (any)
+ * @param[in] i_model Model of matching target, default NA (any)
+ */
+ PredicateCTM(
+ CLASS i_class = CLASS_NA,
+ TYPE i_type = TYPE_NA,
+ MODEL i_model = MODEL_NA);
+
+ /**
+ * @brief Destroy a class, type, model predicate
+ */
+ virtual ~PredicateCTM();
+
+ /**
+ * @brief Set the class
+ *
+ * @param[in] i_class Class of matching target
+ */
+ void setClass(CLASS i_class);
+
+ /**
+ * @brief Set the type
+ *
+ * @param[in] i_type Type of matching target
+ */
+ void setType(TYPE i_type);
+
+ /**
+ * @brief Set the model
+ *
+ * @param[in] i_model Model of matching target
+ */
+ void setModel(MODEL i_model);
+
+ /**
+ * @brief Returns whether target matches the specified class, type,
+ * model
+ *
+ * @par Detailed Description:
+ * Returns whether target matches the specified class, type, model.
+ * Note that all three fields are always compared, so wildcards
+ * (CLASS_NA, TYPE_NA, MODEL_NA) must be used for any fields that
+ * do not matter. See PredicateBase class for parameter/return
+ * description.
+ *
+ * @param[in] i_pTarget
+ * Target handle pointing to the target to compare to
+ *
+ * @return bool indicating whether the target matches or not
+ */
+ virtual bool operator()(
+ const Target* i_pTarget) const;
+
+ private:
+
+ CLASS iv_class; ///< Class to compare with that of target
+ TYPE iv_type; ///< Type to compare with that of target
+ MODEL iv_model; ///< Model to compare with that of target
+
+ TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS(PredicateCTM);
+};
+
+//******************************************************************************
+// PredicateCTM::PredicateCTM
+//******************************************************************************
+
+inline PredicateCTM::PredicateCTM(
+ const CLASS i_class,
+ const TYPE i_type,
+ const MODEL i_model)
+: iv_class(i_class),
+ iv_type(i_type),
+ iv_model(i_model)
+{
+ #define TARG_FUNC "PredicateCTM(...)"
+ #undef TARG_FUNC
+}
+
+//******************************************************************************
+// PredicateCTM::setClass
+//******************************************************************************
+
+inline void PredicateCTM::setClass(CLASS i_class)
+{
+ iv_class = i_class;
+}
+
+//******************************************************************************
+// PredicateCTM::setType
+//******************************************************************************
+
+inline void PredicateCTM::setType(TYPE i_type)
+{
+ iv_type = i_type;
+}
+
+//******************************************************************************
+// PredicateCTM::setModel
+//******************************************************************************
+
+inline void PredicateCTM::setModel(MODEL i_model)
+{
+ iv_model = i_model;
+}
+
+#undef TARG_CLASS
+#undef TARG_NAMESPACE
+
+} // End namespace TARGETING
+
+#endif // __TARGETING_COMMON_PREDICATECTM_H
diff --git a/src/include/usr/targeting/common/predicates/predicateisfunctional.H b/src/include/usr/targeting/common/predicates/predicateisfunctional.H
new file mode 100644
index 000000000..b203ebd41
--- /dev/null
+++ b/src/include/usr/targeting/common/predicates/predicateisfunctional.H
@@ -0,0 +1,106 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/targeting/predicates/predicateisfunctional.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2012
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+
+#ifndef __TARGETING_COMMON_PREDICATEISFUNCTIONAL_H
+#define __TARGETING_COMMON_PREDICATEISFUNCTIONAL_H
+/**
+ * @file targeting/common/predicates/predicateisfunctional.H
+ *
+ * PredicateIsFunctional class, used to filter targets for HWP wrapper.
+ * From the example tutorial page at
+ * https://w3-connections.ibm.com/wikis/home?lang=en_US#/wiki/Host%20Boot/page/Target%20And%20Attribute%20Usage%20Guide
+ * :
+ * Create Custom Predicate
+ * Take the following predicate "template" and customize to your needs.
+ * Make sure to:
+ * 1) Rename the class in the appropriate places
+ * 2) Implement the operator() function which should return "true" if
+ * the given Target matches the predicate criteria, false otherwise
+ * 3) Add any input arguments to the constructor, and any necessary
+ * private variables to store state
+ * 4) Implement the destructor, if needed
+ * 5) Update documentation
+ *
+ * See example in src/include/usr/targeting/predicate/predicatectm.H
+ * (and usr/targeting/predicate/predicatectm.C)
+ *
+ */
+
+
+/******************************************************************************/
+// Includes
+/******************************************************************************/
+#include <stdint.h>
+
+// targeting support.
+#include <targeting/common/attributes.H>
+#include <targeting/common/entitypath.H>
+#include <targeting/common/target.H>
+#include <targeting/common/targetservice.H>
+#include <targeting/common/iterators/rangefilter.H>
+#include <targeting/common/predicates/predicatectm.H>
+
+
+namespace TARGETING
+{
+
+class PredicateIsFunctional : public PredicateBase
+{
+
+public:
+
+ /**
+ * @brief Create a predicate to select targets that
+ * are marked functional.
+ * Default (no parms) is to check for functional: assumption is that
+ * functional implies poweredOn, etc.
+ * More function will probably be added later.
+ *
+ */
+ PredicateIsFunctional( );
+
+
+ /**
+ * @brief Destroy the predicate
+ */
+ virtual ~PredicateIsFunctional();
+
+ /**
+ * @brief returns true if target is marked functional
+ *
+ * @param[in] i_pTarget
+ * Handle to the target to perform the predicate check on
+ *
+ * @return bool indicating whether target it functional or not
+ */
+ inline bool operator()(
+ const TARGETING::Target* i_pTarget) const ;
+
+private:
+
+ TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS(PredicateIsFunctional);
+};
+
+}; // end namespace
+
+#endif // __TARGETING_COMMON_PREDICATEISFUNCTIONAL_H
diff --git a/src/include/usr/targeting/common/predicates/predicatepostfixexpr.H b/src/include/usr/targeting/common/predicates/predicatepostfixexpr.H
new file mode 100644
index 000000000..44fabfb62
--- /dev/null
+++ b/src/include/usr/targeting/common/predicates/predicatepostfixexpr.H
@@ -0,0 +1,231 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/targeting/predicates/predicatepostfixexpr.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+
+#ifndef __TARGETING_COMMON_PREDICATEPOSTFIXEXPR_H
+#define __TARGETING_COMMON_PREDICATEPOSTFIXEXPR_H
+
+/**
+ * @file targeting/common/predicatepostfixexpr.H
+ *
+ * @brief Interface for predicate which allows callers to chain multiple other
+ * predicates together in complex logical expressions, and then evaluate
+ * them against a target
+ */
+
+//******************************************************************************
+// Includes
+//******************************************************************************
+
+// STD
+#include <vector>
+
+// Other Host Boot Components
+
+// Targeting Component
+#include <targeting/common/predicates/predicatebase.H>
+
+//******************************************************************************
+// Macros
+//******************************************************************************
+
+#undef TARG_NAMESPACE
+#undef TARG_CLASS
+#undef TARG_FN
+
+//******************************************************************************
+// Interface
+//******************************************************************************
+
+namespace TARGETING
+{
+
+#define TARG_NAMESPACE "TARGETING::"
+#define TARG_CLASS "PredicatePostfixExpr::"
+
+class Target;
+
+/**
+ * @brief Predicate which can compute aribtrarily complex logical expressions
+ * of other predicates using postfix notation
+ */
+class PredicatePostfixExpr : public PredicateBase
+{
+ public:
+
+ /**
+ * @brief Create empty postfix predicate expression which will always
+ * evaluate true if not otherwise modified. Any updates to the
+ * expression completely replace the initial "always true"
+ * behavior.
+ */
+ PredicatePostfixExpr();
+
+ /**
+ * @brief Destroy a postfix predicate expression
+ *
+ * @note: Nothing extra to do here since object does not own the
+ * predicates
+ */
+ virtual ~PredicatePostfixExpr();
+
+ /**
+ * @brief Updates the postfix predicate expression by pushing the given
+ * predicate onto the expression stack
+ *
+ * @param[in] i_pPredicate Pointer to existing concrete predicate.
+ * Passing a NULL predicate is not allowed (results in assert)
+ *
+ * @verbatim
+ * Example:
+ *
+ * Stack before calling push(&P2): P1
+ * Stack after calling push(&P2): P1 P2
+ * @endverbatim
+ *
+ * @return Reference to the same predicate expression, for chaining
+ */
+ PredicatePostfixExpr& push(
+ const PredicateBase* i_pPredicate);
+
+ /**
+ * @brief Updates the postfix predicate expression by pushing the
+ * logical "AND" operation onto the expression stack.
+ *
+ * @verbatim
+ * Example:
+ *
+ * Stack before calling And(): P1 P2
+ * Stack after calling And(): P1 P2 AND
+ * Stack after evaluation: (P1 && P2)
+ * @endverbatim
+ *
+ * @return Reference to the same predicate expression, for chaining
+ */
+ PredicatePostfixExpr& And();
+
+ /**
+ * @brief Updates the postfix predicate expression by pushing the
+ * logical "NOT" operation onto the expression stack.
+ *
+ * @verbatim
+ * Example:
+ *
+ * Stack before calling Not(): P1
+ * Stack after calling Not(): P1 NOT
+ * Stack after evaluation: (!P1)
+ * @endverbatim
+ *
+ * @return Reference to the same predicate expression, for chaining
+ */
+ PredicatePostfixExpr& Not();
+
+ /**
+ * @brief Updates the postfix predicate expression by pushing the
+ * logical "OR" operation onto the expression stack.
+ *
+ * @verbatim
+ * Example:
+ *
+ * Stack before calling Or(): P1 P2
+ * Stack after calling Or(): P1 P2 OR
+ * Stack after evaluation: (P1 || P2)
+ * @endverbatim
+ *
+ * @return Reference to the same predicate expression for chaining
+ */
+ PredicatePostfixExpr& Or();
+
+ /**
+ * @brief Returns whether the given target matches the criteria
+ * specified by the postfix predicate expression
+ *
+ * @par Detailed Description:
+ * Returns whether the given target matches the criteria
+ * specified by the postfix predicate expression. The routine
+ * sequentially evaluates a predicate against the supplied target
+ * or applies a logical operation to one or more prior predicate
+ * evaluations using a postfix algorithm. Routine will assert
+ * if postfix expression is not formatted properly, final result
+ * stack does not have exactly one result, target is NULL, or
+ * invalid logical operator was requested. See PredicateBase class
+ * for parameter/return description.
+ *
+ * @verbatim
+ * Example:
+ *
+ * PredicatePostfixExpr l_expr;
+ * l_expr.push(&P1).push(&P2).Or().push(&P3).And().Not();
+ *
+ * Equivalent infix expression: !((P1 || P2) && P3)
+ * Assume predicate results of: P1 = 0, P2 = 1, P3 = 0
+ * Expression stack prior to evaluation: P1 P2 OR P3 AND NOT
+ * Evaluation step 1: 1 P3 AND NOT (evaluated P1 P2 OR)
+ * Evaluation step 2: 0 NOT (evaluated 1 P3 AND)
+ * Evaluation step 3: 1 (evaluated 0 NOT; final result)
+ * @endverbatim
+ *
+ * @param[in] i_pTarget
+ * Handle of the target to evaluate the expression against
+ *
+ * @return bool indicating whether the expression is true or no
+ */
+ virtual bool operator()(
+ const Target* i_pTarget) const;
+
+ private:
+
+ /**
+ * @brief Enumeration describing the type of logical operator to
+ * apply to one or more previous predicate evaluations
+ */
+ enum LogicalOperator
+ {
+ EVAL, ///< Special logical operator - evaluate a predicate
+ AND, ///< Logically AND the result of the preceding two evaluations
+ OR, ///< Logically OR the result of the preceding two evaluations
+ NOT, ///< Logically negate the result of the preceding evaluation
+ };
+
+ /**
+ * @brief Structure describing one unit of the postfix predicate
+ * expression under evaluation
+ */
+ struct Operation
+ {
+ LogicalOperator logicalOp; ///< Logical operator to
+ ///< apply to result stack
+ const PredicateBase* pPredicate; ///< Predicate to evaluate,
+ ///< if logicalOp == EVAL
+ };
+
+ std::vector<Operation> iv_ops; ///< Expression operations to perform
+
+ TARG_DISABLE_COPY_AND_ASSIGNMENT_OPERATORS(PredicatePostfixExpr);
+};
+
+#undef TARG_CLASS
+#undef TARG_NAMESPACE
+
+} // End namespace TARGETING
+
+#endif // __TARGETING_COMMON_PREDICATEPOSTFIXEXPR_H
diff --git a/src/include/usr/targeting/common/predicates/predicates.H b/src/include/usr/targeting/common/predicates/predicates.H
new file mode 100644
index 000000000..5a7cf04d9
--- /dev/null
+++ b/src/include/usr/targeting/common/predicates/predicates.H
@@ -0,0 +1,41 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/targeting/predicates/predicates.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2012
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+
+#ifndef __TARGETING_COMMON_PREDICATES_H
+#define __TARGETING_COMMON_PREDICATES_H
+
+/**
+ * @file targeting/common/predicates/predicates.H
+ *
+ * @brief Shortcut file to pull in all the predicate include files.
+ *
+ */
+#include <targeting/common/predicates/predicatebase.H>
+#include <targeting/common/predicates/predicatectm.H>
+#include <targeting/common/predicates/predicateisfunctional.H>
+#include <targeting/common/predicates/predicatepostfixexpr.H>
+
+// please keep up to date...
+
+#endif // __TARGETING_COMMON_PREDICATES_H
+
OpenPOWER on IntegriCloud