110428Sandreas.hansson@arm.com/*
210428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Delft
310428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Eindhoven
410428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Kaiserslautern
510428Sandreas.hansson@arm.com * All rights reserved.
610428Sandreas.hansson@arm.com *
710428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
810428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
910428Sandreas.hansson@arm.com * met:
1010428Sandreas.hansson@arm.com *
1110428Sandreas.hansson@arm.com * 1. Redistributions of source code must retain the above copyright
1210428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer.
1310428Sandreas.hansson@arm.com *
1410428Sandreas.hansson@arm.com * 2. Redistributions in binary form must reproduce the above copyright
1510428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1610428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution.
1710428Sandreas.hansson@arm.com *
1810428Sandreas.hansson@arm.com * 3. Neither the name of the copyright holder nor the names of its
1910428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
2010428Sandreas.hansson@arm.com * this software without specific prior written permission.
2110428Sandreas.hansson@arm.com *
2210428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
2310428Sandreas.hansson@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2410428Sandreas.hansson@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
2510428Sandreas.hansson@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2610428Sandreas.hansson@arm.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2710428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2810428Sandreas.hansson@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2910428Sandreas.hansson@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3010428Sandreas.hansson@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3110428Sandreas.hansson@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3210428Sandreas.hansson@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3310428Sandreas.hansson@arm.com *
3410428Sandreas.hansson@arm.com * Authors: Andreas Hansson
3510428Sandreas.hansson@arm.com *
3610428Sandreas.hansson@arm.com */
3710428Sandreas.hansson@arm.com
3810428Sandreas.hansson@arm.com#ifndef DATA_PARAMETRISABLE_H
3910428Sandreas.hansson@arm.com#define DATA_PARAMETRISABLE_H
4010428Sandreas.hansson@arm.com
4110428Sandreas.hansson@arm.com#include <string>
4210428Sandreas.hansson@arm.com#include <vector>
4310428Sandreas.hansson@arm.com
4410428Sandreas.hansson@arm.com#include "Parameter.h"
4510428Sandreas.hansson@arm.com
4610428Sandreas.hansson@arm.comnamespace Data {
4710428Sandreas.hansson@arm.com/**
4810428Sandreas.hansson@arm.com * Convenience class for the architectural components that are
4910428Sandreas.hansson@arm.com * parametrisable. The interface is shared and implemented only in
5010428Sandreas.hansson@arm.com * this class.
5110428Sandreas.hansson@arm.com */
5210428Sandreas.hansson@arm.comclass Parametrisable {
5310428Sandreas.hansson@arm.com public:
5410428Sandreas.hansson@arm.com  Parametrisable()
5510428Sandreas.hansson@arm.com  {
5610428Sandreas.hansson@arm.com  }
5710428Sandreas.hansson@arm.com
5810428Sandreas.hansson@arm.com  virtual ~Parametrisable()
5910428Sandreas.hansson@arm.com  {
6010428Sandreas.hansson@arm.com  }
6110428Sandreas.hansson@arm.com
6210428Sandreas.hansson@arm.com  /**
6310428Sandreas.hansson@arm.com   * Push a new parameter into the in-order vector without checking
6410428Sandreas.hansson@arm.com   * for duplicates.
6510428Sandreas.hansson@arm.com   */
6610428Sandreas.hansson@arm.com  virtual void pushParameter(const Parameter& parameter);
6710428Sandreas.hansson@arm.com
6810428Sandreas.hansson@arm.com  /**
6910428Sandreas.hansson@arm.com   * Set a parameter with a given index (default 0). This could for
7010428Sandreas.hansson@arm.com   * example be a queue size for a given channel id.
7110428Sandreas.hansson@arm.com   */
7210428Sandreas.hansson@arm.com  void setParameter(const Parameter& parameter,
7310428Sandreas.hansson@arm.com                    unsigned int     index = 0);
7410428Sandreas.hansson@arm.com
7510428Sandreas.hansson@arm.com  /**
7610428Sandreas.hansson@arm.com   * Get a parameter of a given name and of a certain index. Calling
7710428Sandreas.hansson@arm.com   * this method on an object that has no parameter of that name
7810428Sandreas.hansson@arm.com   * will result in application exit.
7910428Sandreas.hansson@arm.com   */
8010428Sandreas.hansson@arm.com  Parameter getParameter(const std::string& id,
8110428Sandreas.hansson@arm.com                         unsigned int       index = 0) const;
8210428Sandreas.hansson@arm.com
8310428Sandreas.hansson@arm.com  /**
8410428Sandreas.hansson@arm.com   * Remove a parameter with a specific name and index. If a parameter
8510428Sandreas.hansson@arm.com   * is removed this method returns true, otherwise false.
8610428Sandreas.hansson@arm.com   */
8710428Sandreas.hansson@arm.com  bool removeParameter(const std::string& id,
8810428Sandreas.hansson@arm.com                       unsigned int       index = 0);
8910428Sandreas.hansson@arm.com
9010428Sandreas.hansson@arm.com  /**
9110428Sandreas.hansson@arm.com   * Simply get all the parameters.
9210428Sandreas.hansson@arm.com   */
9310428Sandreas.hansson@arm.com  std::vector<Parameter> getParameters() const;
9410428Sandreas.hansson@arm.com
9510428Sandreas.hansson@arm.com  /**
9610428Sandreas.hansson@arm.com   * Check if a parameter of a certain name exists in the object.
9710428Sandreas.hansson@arm.com   */
9810428Sandreas.hansson@arm.com  bool hasParameter(const std::string& id,
9910428Sandreas.hansson@arm.com                    unsigned int       index = 0) const;
10010428Sandreas.hansson@arm.com
10110428Sandreas.hansson@arm.com  /**
10210428Sandreas.hansson@arm.com   * Convenience function to set a variable to the value stored in a parameter
10310428Sandreas.hansson@arm.com   * with built in error detection/assertion. Returns true if the value was
10410428Sandreas.hansson@arm.com   * successfully set.
10510428Sandreas.hansson@arm.com   * @param m
10610428Sandreas.hansson@arm.com   * @param paramName
10710428Sandreas.hansson@arm.com   * @param assertOnFail
10810428Sandreas.hansson@arm.com   * @return
10910428Sandreas.hansson@arm.com   */
11010428Sandreas.hansson@arm.com  template<typename T>
11110428Sandreas.hansson@arm.com  bool setVarFromParam(T* m, const char* paramName)
11210428Sandreas.hansson@arm.com  {
11310428Sandreas.hansson@arm.com    if (hasParameter(paramName)) {
11410428Sandreas.hansson@arm.com      *m = static_cast<T>(getParameter(paramName));
11510428Sandreas.hansson@arm.com      return true;
11610428Sandreas.hansson@arm.com    } else {
11710428Sandreas.hansson@arm.com      *m = static_cast<T>(0);
11810428Sandreas.hansson@arm.com      return false;
11910428Sandreas.hansson@arm.com    }
12010428Sandreas.hansson@arm.com  }
12110428Sandreas.hansson@arm.com
12210428Sandreas.hansson@arm.com  template<typename T>
12310428Sandreas.hansson@arm.com  T getParamValWithDefault(const char* paramName, T defaultVal) const
12410428Sandreas.hansson@arm.com  {
12510428Sandreas.hansson@arm.com    if (hasParameter(paramName)) {
12610428Sandreas.hansson@arm.com      return static_cast<T>(getParameter(paramName));
12710428Sandreas.hansson@arm.com    } else   {
12810428Sandreas.hansson@arm.com      return defaultVal;
12910428Sandreas.hansson@arm.com    }
13010428Sandreas.hansson@arm.com  }
13110428Sandreas.hansson@arm.com
13210428Sandreas.hansson@arm.com protected:
13310428Sandreas.hansson@arm.com  std::vector<Parameter> parameters;
13410428Sandreas.hansson@arm.com};
13510428Sandreas.hansson@arm.com}
13610428Sandreas.hansson@arm.com#endif // ifndef DATA_PARAMETRISABLE_H
137