/ .. / / -> download
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2014 Saxonica Limited.
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef SAXON_XDMVALUE_H
#define SAXON_XDMVALUE_H


#include <string.h>
#include "SaxonProcessor.h"
#include <typeinfo> //used for testing only
#include <vector>
#include <deque>
#include <list>
#include "SaxonCGlue.h"
#include "SaxonCXPath.h"


/*! <code>XdmValue</code>. Value in the XDM data model. A value is a sequence of zero or more items,
 * each item being either an atomic value or a node. This class is a wrapper of the the XdmValue object created in Java.
 * <p/>
 */

class SaxonProcessor;
class XdmItem;
class XdmAtomicValue;
class XdmNode;


typedef enum eXdmType { XDM_VALUE = 1, XDM_ITEM = 2, XDM_NODE = 3, XDM_ATOMIC_VALUE = 4, XDM_FUNCTION_ITEM = 5 } XDM_TYPE;

typedef enum saxonTypeEnum
{
	enumNode,
	enumString,
	enumInteger,
	enumDouble,
	enumFloat,
	enumBool,
	enumArrXdmValue
} PRIMITIVE_TYPE;

class XdmValue {


public:
	/**
		 * A default Constructor. Create a empty value
		 */
	XdmValue() {
		xdmSize = 0;
		refCount = 1;
		jValues = NULL;
		valueType = NULL;
		proc = NULL;
	}

	XdmValue(SaxonProcessor * p) {
		proc = p;
		jValues = NULL;
		refCount = 1;
		valueType = NULL;
	}


	/**
	 * A copy constructor.
	 * @param val - Xdmvalue
	 */
	XdmValue(const XdmValue &other);

	/**
	* Constructor. Create a value from a collection of items
	* @param val - Xdmvalue
	*/
	//XdmValue(XdmValue * items, int length);



	 /**
	 * Constructor. Create a value from a collection of items
	 * @param val - Xdmvalue
	 */
	 //XdmValue(XdmItem *items, int length);

	 /**
	  * Add an XdmItem  to the sequence. This method is designed for the primitive types.
	  * @param type - specify target type of the value
	  * @param val - Value to convert
	  */
	XdmValue * addXdmValueWithType(const char * tStr, const char * val);//TODO check and document

	/**
	 * Add an XdmItem to the sequence.
	 * See functions in SaxonCXPath of the C library
	 * @param val - XdmItem object
	 */
	void addXdmItem(XdmItem *val);

	/**
	 * Add an Java XdmValue object to the sequence.
	 * See methods the functions in SaxonCXPath of the C library
	 * @param val - Java object
	 */
	void addUnderlyingValue(jobject val);




	/**
	 * A Constructor. Handles a sequence of XdmValues given as a  wrapped an Java XdmValue object.
	 * @param val - Java XdmValue object
	 * @param arrFlag - Currently not used but allows for overloading of constructor methods
	 */
	XdmValue(jobject val, bool arrFlag);

	/**
	 * A Constructor. Wrap an Java XdmValue object.
	 * @param val - Java XdmValue object
	 */
	XdmValue(jobject val);


	virtual ~XdmValue();

	void releaseXdmValue();


	/**
	 * Get the first item in the sequence
	 * @return XdmItem or null if sequence is empty
	 */
	virtual XdmItem * getHead();

	/**
	   * Get the n'th item in the value, counting from zero.
	   *
	   * @param n the item that is required, counting the first item in the sequence as item zero
	   * @return the n'th item in the sequence making up the value, counting from zero
	   * return NULL  if n is less than zero or greater than or equal to the number
	   *                                    of items in the value
	   */
	virtual XdmItem * itemAt(int n);

	/**
	 * Get the number of items in the sequence
	 *
	 */
	virtual int size();


	/**
	 * Create a string representation of the value. The is the result of serializing
	 * the value using the adaptive serialization method.
	 * @return a string representation of the value
	 */
	virtual const char * toString();

	int getRefCount() {
		return refCount;
	}



	virtual void incrementRefCount();

	virtual void decrementRefCount();

	void setProcessor(SaxonProcessor *p);


	/*const char * getErrorMessage(int i);
	const char * getErrorCode(int i);
int exceptionCount();*/
	const char * checkFailures() { return failure; }

	/**
	  * Get Java XdmValue object.
	  * @return jobject - The Java object of the XdmValue in its JNI representation
	  */
	virtual  jobject getUnderlyingValue();

	/**
	* Get the type of the object
	*/
	virtual XDM_TYPE getType();

protected:
	SaxonProcessor *proc;
	char* valueType;  /*!< Cached. The type of the XdmValue */


	std::vector<XdmItem*> values;
	int xdmSize; 	/*!< Cached. The count of items in the XdmValue */
	int refCount;
private:
	std::string toStringValue;  /*!< Cached. String representation of the XdmValue, if available */
	jobjectArray jValues;
};

#endif /** SAXON_XDMVALUE_H **/


/ gopher://khzae.net/0/s1kd/s1kd-tools/src/tools/s1kd-brexcheck/saxon/Saxon.C.API/XdmValue.h
Styles: Light Dark Classic